2012-06-19 46 views
32

在MySQL中我想删除一个表。
我尝试了很多事情,但我一直收到错误,表名为bericht的表不能被删除。这是我得到的错误:不能删除表:外键约束失败

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

如何删除该表?

+2

找出其他表通过外键引用它,并首先删除该表上的FK约束,然后删除该表。 –

+0

您需要删除其他表格上的其他表格而不需要其他表格 – BugFinder

+1

这些答案中的任何一个对您有帮助吗? http://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails http://stackoverflow.com/questions/3334619/can not-delete-or-update-a-parent-row-a-foreign-key-constraint-failures –

回答

44

试试这个:

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

这应该救你哪些表必须要下降,一旦放弃了这些引用,或引用数据集在该表中的数据集,你就可以删除该表

+4

此解决方案更好。这样更安全,并且不像所选答案那样不好。 – Sloganho

+1

它为我工作,这个答案应该标记为接受。 – parvez

68

这应该做的表引用诀窍:

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

正如其他人所指出的,这是几乎从来没有你想要的东西,即使它是什么在这个问题问。更安全的解决方案是在删除bericht之前根据bericht删除表。请参阅CloudyMarble关于如何做到这一点的答案。当我不想或者不能删除并重新创建数据库本身时,我使用bash和我的文章中的方法删除数据库中的所有表。

#1217错误发生在其他表有外键约束您试图删除,并且您使用的是InnoDB数据库引擎的表。此解决方案暂时禁用检查限制,然后重新启用它们。阅读documentation了解更多信息。一定要删除外键约束和字段取决于bericht表,否则你可能会离开你的数据库处于中断状态。

+2

这应该选择回答 – kyeno

+0

到现在这是最好的答案,应该在顶部!!!!!! –

+1

虽然这是正确的,但这是一个令人惊讶的不良做法。正如多位用户(包括Rune Kaagaard)指出的那样,您应该根据需要找到参考资料,分析并放弃它们。 – zozo

1

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

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

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”,以避免不必要的并发症,但是你的设置可能决定了不同的方法。

希望这会有所帮助。