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

问题描述 投票:0回答:7

在 MySQL 中我想删除一个表。
我尝试了很多方法,但不断收到名为

bericht
的表无法删除的错误。这是我收到的错误:

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

如何删除这张桌子?

mysql sql drop-table
7个回答
191
投票

这应该可以解决问题:

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

正如其他人指出的那样,这几乎从来都不是您想要的,即使这是问题中提出的。更安全的解决方案是先删除依赖于

bericht
的表,然后再删除
bericht
。请参阅 CloudyMarble 答案了解如何执行此操作。当我不想或无法删除并重新创建数据库本身时,我使用 bash 和我的帖子中的方法来删除数据库中的所有表。

当其他表对您尝试删除的表具有外键约束并且您正在使用 InnoDB 数据库引擎时,就会发生

#1217
错误。此解决方案暂时禁用检查约束,然后重新启用它们。阅读文档了解更多信息。请务必根据
bericht
删除表中的外键限制和字段,否则您的数据库可能会处于损坏状态。


91
投票

试试这个:

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

这应该为您提供哪些表引用了您想要删除的表,一旦您删除这些引用,或者引用该表中的数据集的数据集,您将能够删除该表


18
投票

但幸运的是,使用 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/


13
投票

使用

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


2
投票

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

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


1
投票

我意识到这已经过时了一段时间,并且已经选择了答案,但是如何选择允许外键为 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”以避免不必要的复杂化,但是您的设置可能需要不同的方法。

希望这有帮助。


0
投票

当我导入安装主题演示时,会在 WordPress 中显示此错误“表删除失败。无法删除表 '_fwbk_wp_wc_download_log' 上的外键约束 'fk_wp_wc_download_log_permission_id' 引用的表 'wp_woocommerce_downloadable_product_permissions'。”

© www.soinside.com 2019 - 2024. All rights reserved.