在測試庫中需要對一些數據表做清空數據操作時,因爲表之間有外鍵約束,所以,想了解其約束關係,這時可以通過庫information_schema的key_column_usage表來查看。
- CONSTRAINT_CATALOG: 約束所屬目錄的名稱,值始終爲def
- CONSTRAINT_SCHAME: 約束所屬schema(database)名稱
- CONSTRAINT_NAME: 約束名稱
- TABLE_CATALOG: 表所屬目錄的名稱,值始終爲def
- TABLE_SCHEMA: 表所屬schema(database)名稱
- TABLE_NAME: 具有約束的表的名稱
- ORDINAL_POSITION: 列在約束內的位置,而不是列在表中的位置,列位置從1開始
- POSITION_IN_UNIQUE_CONSTRAINT: NULL對於唯一和主鍵約束,對於外鍵約束,此列是正在引用的表的鍵中的序號位置
新建兩個測試表test_a和test_b:
CREATE TABLE `test`.`test_a` (
`id` int(0) NOT NULL,
`aa` varchar(255) NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `test`.`test_b` (
`id` int(11) NOT NULL,
`id_a` int(11) NULL,
`b` varchar(255) NULL,
PRIMARY KEY (`id`)
);
test_b表增加外鍵:
ALTER TABLE `test`.`test_b`
ADD CONSTRAINT `fk_test_b` FOREIGN KEY (`id_a`) REFERENCES `test`.`test_a` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
設外鍵時,有如下幾種關係:
CASCADE: 在父表上update/delete記錄時,同步update/delete掉字表的匹配記錄
SET NULL: 在父表上update/delete記錄時,將子表上匹配記錄的列設爲null(要注意字表的外鍵列不能爲not null)
NO ACTION: 如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作
RESTRICT: 同no action, 都是立即檢查外鍵約束
這時,查看一下表test_a的外鍵關係,列關係正確:
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME='test_a'