如何更改外键引用操作? (行为)

我build立了一个表,其中包含一个带有外键的列,设置为ON DELETE CASCADE (删除父项时删除子项)

SQL命令是什么将其更改为ON DELETE RESTRICT ? (如果有孩子,不能删除父母)

老问题,但添加答案,以便可以得到帮助

其两个步骤:

假设table1有一个外键 ,列名为fk_table2_id约束名为fk_nametable2被引用为表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