如何 drop 有 foreign key 的 mysql table?

父子表定义

一张 “订单表 Orders” 中有一个字段 “customer_id” 顾客id,指向顾客表 (Customers) 的主键(id字段),那么 顾客表就叫做“父表”或“被引用表”,而顾客表被称为“子表”或“引用表”。

当 drop 父表时,必须先删除掉“子表”,否则 mysql 会报告:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

如果两张表互相之间相互引用,那么无论用什么删除顺序都无法删除表。

这时可以用设置变量 “” 的方式来解决,即告诉 MySQL 不要检查外键约束了。

SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;

Grails 的 dbCreate 属性

当 Grails 的 dbCreate 设置为 “create-drop” 的时候,正常情况下启动 Grails 时数据库表都能被 drop 并重新创建一遍,但是如果有这些外键关系存在时会导致 drop 失败,也就无法重新建表,导致 表结构 不能正确更新。

需要手工按照上面的方法删除 table 后重新启动。

参考资料

mysql 外键介绍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章