1. 程式人生 > 資料庫 >Mysql中索引和約束的示例語句

Mysql中索引和約束的示例語句

外來鍵

查詢一個表的主鍵是哪些表的外來鍵

SELECT
	TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
	TABLE_SCHEMA = 'mydbname'
	AND REFERENCED_TABLE_NAME = '表名';

匯出所有外來鍵語句

SELECT
	CONCAT('ALTER TABLE ',TABLE_NAME,' ADD CONSTRAINT ',' FOREIGN KEY (',') REFERENCES ','(',REFERENCED_COLUMN_NAME,') ON DELETE CASCADE ON UPDATE CASCADE;')
FROM
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
	TABLE_SCHEMA = 'mydbname'
	AND REFERENCED_TABLE_NAME IS NOT NULL;

刪除所有外來鍵語句

SELECT
	CONCAT('ALTER TABLE ',' DROP FOREIGN KEY ',';')
FROM
	INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
	TABLE_SCHEMA = 'mydbname'
	AND REFERENCED_TABLE_NAME IS NOT NULL;

自增

匯出建立自增欄位的語句

SELECT
	CONCAT( 'ALTER TABLE `','` ','MODIFY COLUMN `',UPPER( COLUMN_TYPE ),' NOT NULL AUTO_INCREMENT COMMENT "',COLUMN_COMMENT,'";' ) as 'ADD_AUTO_INCREMENT'
FROM
	information_schema.COLUMNS 
WHERE
	TABLE_SCHEMA = 'mydbname' 
	AND EXTRA = UPPER( 'AUTO_INCREMENT' ) 
ORDER BY
	TABLE_NAME ASC;

建立刪除所有自增欄位

SELECT
	CONCAT( 'ALTER TABLE `',' NOT NULL;' ) as 'DELETE_AUTO_INCREMENT'
FROM
	information_schema.COLUMNS 
WHERE
	TABLE_SCHEMA = 'mydbname' 
	AND EXTRA = UPPER( 'AUTO_INCREMENT' ) 
ORDER BY
	TABLE_NAME ASC;

索引

匯出所有索引

SELECT
	CONCAT(
		'ALTER TABLE `','ADD ',IF
		(
			NON_UNIQUE = 1,CASE
				UPPER( INDEX_TYPE ) 
				WHEN 'FULLTEXT' THEN
				'FULLTEXT INDEX' 
				WHEN 'SPATIAL' THEN
				'SPATIAL INDEX' ELSE CONCAT( 'INDEX `',INDEX_NAME,'` USING ',INDEX_TYPE ) 
			END,IF
			(
				UPPER( INDEX_NAME ) = 'PRIMARY',CONCAT( 'PRIMARY KEY USING ',INDEX_TYPE ),CONCAT( 'UNIQUE INDEX `',INDEX_TYPE ))),CONCAT( '(`','`)' ),';' 
) AS 'ADD_ALL_INDEX' 
FROM
	information_schema.STATISTICS 
WHERE
	TABLE_SCHEMA = 'mydbname' 
ORDER BY
	TABLE_NAME ASC,INDEX_NAME ASC;

刪除所有索引

SELECT
	CONCAT( 'ALTER TABLE `',CONCAT( 'DROP ',IF ( UPPER( INDEX_NAME ) = 'PRIMARY','PRIMARY KEY',CONCAT( 'INDEX `','`' ))),';' ) AS 'DELETE_ALL_INDEX' 
FROM
	information_schema.STATISTICS 
WHERE
	TABLE_SCHEMA = 'mydbname' 
ORDER BY
	TABLE_NAME ASC;

資料合併

在資料遷移合併的時候,比較棘手的是不同資料庫主鍵重複,那麼我們就要批量修改主鍵的值,為了避免重複我們可以把自增的數字改為字串

步驟基本上有以下幾步

  • 取消主鍵自增
  • 刪除所有外來鍵
  • 修改主鍵欄位為varchar
  • 新增所有外來鍵
  • 修改主鍵的值
  • 合併資料

修改主鍵值的時候要注意

如果包含id和pid這種自關聯的情況下是不能直接修改值的,就需要先刪除約束再新增。

比如

刪除自約束

ALTER TABLE `t_director` DROP FOREIGN KEY `fk_directorpid`;

修改值

update t_director set directorid=directorid+100000000;
update t_director set directorid=CONV(directorid,10,36);

update t_director set directorpid=directorpid+100000000 WHERE directorpid is not null;
update t_director set directorpid=CONV(directorpid,36) WHERE directorpid is not null;

新增自約束

ALTER TABLE t_director ADD CONSTRAINT fk_directorpid FOREIGN KEY (directorpid) REFERENCES t_director(directorid) ON DELETE CASCADE ON UPDATE CASCADE;

注意

CONV(directorpid,36)後兩個引數為原數字進位制和要轉換後的進位制。

第一個引數只要內容是數字就算型別為varchar也可以轉換。

以上就是Mysql中索引和約束的示例語句的詳細內容,更多關於MySQL 索引和約束的資料請關注我們其它相關文章!