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

时间:2012-06-19 12:26:43

标签: mysql sql drop-table

在MySQL中我想放一张桌子 我尝试了很多东西,但我不断收到错误,即无法删除名为bericht的表。这是我得到的错误:

  

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

如何删除此表?

6 个答案:

答案 0 :(得分:114)

这应该可以解决问题:

SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1;

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

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

答案 1 :(得分:62)

试试这个:

SELECT * 
FROM information_schema.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_NAME = 'YourTable';

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

答案 2 :(得分:6)

使用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

答案 3 :(得分:5)

但是幸运的是,有了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;

有关更多说明,请查看以下链接:

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

答案 4 :(得分:1)

这可能与其他模式具有相同的表格,这就是您收到该错误的原因。

您需要首先删除子行,然后删除父行。

答案 5 :(得分:0)

我意识到这已经陈旧了一段时间并且已经选择了答案,但是如果允许外键为 NULL ,然后选择 ON DELETE SET NULL

基本上,你的表应该这样改变:

ALTER TABLE 'bericht' DROP FOREIGN KEY 'your_foreign_key';

ALTER TABLE 'bericht' ADD CONSTRAINT 'your_foreign_key' FOREIGN KEY ('column_foreign_key') REFERENCES 'other_table' ('column_parent_key') ON UPDATE CASCADE ON DELETE SET NULL;

我个人建议同时使用“ON UPDATE CASCADE”以及“ON DELETE SET NULL”以避免不必要的复杂情况,但是你的设置可能会采用不同的方法。

希望这有帮助。