如何更改外键引用操作? (行为)
我build立了一个表,其中包含一个带有外键的列,设置为ON DELETE CASCADE
(删除父项时删除子项)
SQL命令是什么将其更改为ON DELETE RESTRICT
? (如果有孩子,不能删除父母)
老问题,但添加答案,以便可以得到帮助
其两个步骤:
假设table1
有一个外键 ,列名为fk_table2_id
, 约束名为fk_name
而table2
被引用为表t2
( 在我的图中如下所示 )。
table1 [ fk_table2_id ] --> table2 [t2]
第一步 ,DROP老CONSTRAINT 🙁 参考 )
ALTER TABLE `table1` DROP FOREIGN KEY `fk_name`;
通知约束被删除,列不被删除
第二步 ,添加新的CONSTRAINT:
ALTER TABLE `table1` ADD CONSTRAINT `fk_name` FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;
添加约束,列已经在那里
例:
我有一个UserDetails
表引用Users
表:
mysql> SHOW CREATE TABLE UserDetails; : : `User_id` int(11) DEFAULT NULL, PRIMARY KEY (`Detail_id`), KEY `FK_User_id` (`User_id`), CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) : :
第一步:
mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`; Query OK, 1 row affected (0.07 sec)
第二步:
mysql> ALTER TABLE `UserDetails` ADD CONSTRAINT `FK_User_id` -> FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE; Query OK, 1 row affected (0.02 sec)
结果:
mysql> SHOW CREATE TABLE UserDetails; : : `User_id` int(11) DEFAULT NULL, PRIMARY KEY (`Detail_id`), KEY `FK_User_id` (`User_id`), CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE :
ALTER TABLE DROP FOREIGN KEY fk_name; ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols) REFERENCES tbl_name(pk_names) ON DELETE RESTRICT;
如果你愿意改变它的名字,你可以在一个查询中做到这一点:
ALTER TABLE table_name DROP FOREIGN KEY `fk_name`, ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`) REFERENCES `other_table` (`id`) ON DELETE CASCADE;
如果您有一张大桌子,这可以最大限度地减less停机时间。
请记住,删除外键后,MySQL在列上保留一个简单的索引。 所以,如果你需要改变'参考'栏,你应该分三步进行
- 放弃原来的FK
- 删除一个索引(名字与前面的fk一样,使用
drop index
子句) - 创build新的FK
您可以简单地使用一个查询来ALTER TABLE products DROP FOREIGN KEY oldConstraintName, ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE
它们: ALTER TABLE products DROP FOREIGN KEY oldConstraintName, ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE