无法删除表:外键约束失败

roy*_*roy 48 mysql sql drop-table

在MySQL中我想删除一个表.
我尝试了很多东西,但我不断收到错误,表名bericht不能删除.这是我得到的错误:

#1217 - 无法删除或更新父行:外键约束失败

我该如何删除此表?

Run*_*ard 125

这应该做的伎俩:

SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)

正如其他人所指出的那样,这几乎不是你想要的,尽管问题是什么问题.更安全的解决方案是在删除bericht之前删除表bericht.请参阅CloudyMarble有关如何执行此操作的答案.当我不想删除或无法删除并重新创建数据库本身时,我使用bash和我的帖子中的方法删除数据库中的所有表.

#1217当其他表对您要删除的表具有外键约束并且您正在使用InnoDB数据库引擎时,会发生此错误.此解决方案暂时禁用检查约束,然后重新启用它们.阅读文档了解更多信息.请务必删除表中的外键约束和字段bericht,否则可能会使数据库处于损坏状态.

  • 虽然这是正确的,但这样做是一个令人惊讶的不良做法.正如多个用户(包括Rune Kaagaard)所指出的那样,您应该根据需要找到引用,分析并删除它们. (4认同)
  • 人们说这是不好的做法,但这实际上取决于用例,所以不要无缘无故地使用大词...... (4认同)
  • 在有人要删除表然后再次创建表的情况下(也许进行了一些更改,但是FK列仍然存在),那么这是一个很好的解决方案。再次创建表后,其他表中的外键仍然有效。除了:可以修改表,而不是先修改DROP,再修改CREATE-这也许是更正确的解决方案。但是,如果使用脚本创建表,我想使用DROP / CREATE方法是明智的。 (3认同)
  • 我有一种情况,没有表引用我试图删除的表,但得到了同样的错误.`select*from information_schema.KEY_COLUMN_USAGE where referenced_table_name ='table_to_delete';`返回一个空集.我认为这是InnoDB引擎的一个问题.这个解决方案也适用于我的情况. (3认同)

Clo*_*ble 67

试试这个:

SELECT * 
FROM information_schema.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'YourTable';
Run Code Online (Sandbox Code Playgroud)

这应该可以为您提供哪些表具有您要删除的表的引用,删除这些引用后,或者在此表中引用数据集的数据集,您将能够删除表

  • 观察 fks 的最佳方式,而不是强制丢弃,可能会产生意想不到的结果。 (3认同)

小智 12

但幸运的是,使用 MySQL FOREIGN_KEY_CHECKS 变量,您完全不必担心 DROP TABLE 语句的顺序,您可以按照您喜欢的任何顺序编写它们——甚至完全相反——就像这样:

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;
Run Code Online (Sandbox Code Playgroud)

如需更多说明,请查看以下链接:

http://alvinalexander.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys/


mih*_*imi 8

使用show create table tbl_name查看外键

您可以使用此语法删除外键:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol

这里还有更多信息(参见Frank Vanderhallen的帖子):http: //dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html