最近在寫Rafy底層的一些東西,在數據庫方面把MySql數據庫集成到里面去,里面有一個需求,需要獲取非系統數據庫,也就是我們自己建立的數據庫中所有表的主鍵和外鍵元數據列表。
第一種方法:是網上的方法,可以直接使用,【MySQL 查看數據庫中有主外鍵關系的表信息】
SELECT C.TABLE_SCHEMA 擁有者,
C.REFERENCED_TABLE_NAME 父表名稱 ,
C.REFERENCED_COLUMN_NAME 父表字段 ,
C.TABLE_NAME 子表名稱,
C.COLUMN_NAME 子表字段,
C.CONSTRAINT_NAME 約束名,
T.TABLE_COMMENT 表注釋,
R.UPDATE_RULE 約束更新規則,
R.DELETE_RULE 約束刪除規則
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE C
JOIN INFORMATION_SCHEMA. TABLES T
ON T.TABLE_NAME = C.TABLE_NAME
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS R
ON R.TABLE_NAME = C.TABLE_NAME
AND R.CONSTRAINT_NAME = C.CONSTRAINT_NAME
AND R.REFERENCED_TABLE_NAME = C.REFERENCED_TABLE_NAME
WHERE C.REFERENCED_TABLE_NAME IS NOT NULL ;
UPDATE/DELETE_RULE 類型:
1. CASCADE: 從父表中刪除或更新對應的行 ,同時自動的刪除或更新自表中匹配的行 。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持 。
2. SET NULL: 從父表中刪除或更新對應的行 ,同時將子表中的外鍵列設為空 。注意, 這些在外鍵列沒有被設為NOT NULL時才有效。 ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持 。
3. NO ACTION: InnoDB拒絕刪除或者更新父表 。
4. RESTRICT: 拒絕刪除或者更新父表 。指定RESTRICT( 或者NO ACTION )和忽略ON DELETE或者ON UPDATE選項的效果是一樣的 。
5. SET DEFAULT: InnoDB目前不支持 。
第二種方法:
select O.CONSTRAINT_SCHEMA,O.CONSTRAINT_NAME,O.TABLE_SCHEMA,O.TABLE_NAME,O.COLUMN_NAME,O.REFERENCED_TABLE_SCHEMA,O.REFERENCED_TABLE_NAME,O.REFERENCED_COLUMN_NAME,O.UPDATE_RULE,O.DELETE_RULE,O.UNIQUE_CONSTRAINT_NAME,T.CONSTRAINT_TYPE from (
select K.CONSTRAINT_SCHEMA,K.CONSTRAINT_NAME,K.TABLE_SCHEMA,K.TABLE_NAME,K.COLUMN_NAME,K.REFERENCED_TABLE_SCHEMA,K.REFERENCED_TABLE_NAME,K.REFERENCED_COLUMN_NAME,R.UPDATE_RULE,R.DELETE_RULE,R.UNIQUE_CONSTRAINT_NAME from information_schema.KEY_COLUMN_USAGE K LEFT join information_schema.REFERENTIAL_CONSTRAINTS R on K.CONSTRAINT_NAME=R.CONSTRAINT_NAME)
as O inner join Information_schema.TABLE_CONSTRAINTS T on O.Table_Name=T.TABLE_NAME and T.CONSTRAINT_NAME=O.CONSTRAINT_NAME where O.CONSTRAINT_SCHEMA!='mysql' and O.CONSTRAINT_SCHEMA!='sys';
第二種方法會列出所有的非系統數據所有表的主鍵信息和外鍵信息,第一種方法只會列出外鍵約束信息。
