MySQL删除表:Cannot delete or update a parent row: a foreign key constraint fails。

本文介绍了解决MySQL中因外键约束导致无法删除表的问题。通过临时禁用外键检查,可以成功删除表,然后重新启用检查以保持表结构完整。

MySQL库中有俩表,table1和table2,相互关联,在删除表的时候出错:

Cannot delete or update a parent row: a foreign key constraint fails。

很明显这是表关联生成的强制约束问题,在删除的时候回检查表之间的关联关系,从而导致无法删除,解决办法:

SET foreign_key_checks = 0;  // 先设置外键约束检查关闭
 
drop table table1;  // 删除表,如果要删除视图,也是如此
 
SET foreign_key_checks = 1; // 开启外键约束检查,以保持表结构完整性
MySQL的环境变量中存在一个foreign_key_checks,这是默认检查外键的配置项,如果将其设置为0,则表示不检查外键约束。查看foreign_key_checks的值:

show VARIABLES like "foreign%";

运行结果:

mysql> show variables like “foreign%”;
±-------------------±------+
| Variable_name | Value |
±-------------------±------+
| foreign_key_checks | OFF |
±-------------------±------+
1 row in set, 1 warning (0.01 sec)
这是因为我将foreign_key_checks的值设置为了0,所以这里显示的是OFF,为关闭状态。运行SET foreign_key_checks = 1;将其设置为1,那这里的状态将是ON。
注意:在删除完表之后,最好是重新打开检查(SET foreign_key_checks = 1) 以保持表格结构的完整性。

参考链接:https://stackoverflow.com/questions/2300396/force-drop-mysql-bypassing-foreign-key-constraint?rq=1

MySQL 中执行 `DROP TABLE Student CASCADE` 语句时出现 `ERROR 1217 (23000) Cannot delete or update a parent row: a foreign key constraint fails` 错误,这意味着要删除的 `Student` 是其他的父,存在外键引用,直接删除会破坏外键约束。以下是几种解决办法: ### 方法一:先删除关联 找出引用了 `Student` 的子,先删除这些子,再删除 `Student` 。可以通过以下 SQL 查询找出引用了 `Student` 的外键约束: ```sql SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = 'Student'; ``` 执行上述查询后,会得到引用了 `Student` 的子信息。然后依次删除这些子,最后删除 `Student` : ```sql -- 删除 DROP TABLE IF EXISTS ChildTable1; DROP TABLE IF EXISTS ChildTable2; -- 最后删除 Student DROP TABLE Student; ``` ### 方法二:临时禁用外键约束 可以临时禁用外键约束,删除 `Student` 后再启用外键约束。不过这种方法需要谨慎使用,因为在禁用外键约束期间,可能会插入不符合约束的数据。 ```sql -- 禁用外键约束 SET FOREIGN_KEY_CHECKS = 0; -- 删除 Student DROP TABLE Student; -- 启用外键约束 SET FOREIGN_KEY_CHECKS = 1; ``` ### 方法三:修改外键约束 如果可能的话,可以修改子的外键约束,将其设置为 `ON DELETE CASCADE` 或 `ON DELETE SET NULL`。这样在删除 `Student` 中的记录时,会自动处理关联的子记录。 ```sql -- 修改外键约束为 ON DELETE CASCADE ALTER TABLE ChildTable DROP FOREIGN KEY fk_constraint_name; ALTER TABLE ChildTable ADD CONSTRAINT fk_constraint_name FOREIGN KEY (student_id) REFERENCES Student(id) ON DELETE CASCADE; -- 现在可以安全地删除 Student DROP TABLE Student; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值