80

在 MySQL 中,我想删除一个表。我尝试了很多东西,但我一直收到无法删除
名为 table 的错误。bericht这是我得到的错误:

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

如何删除此表?

4

6 回答 6

169

这应该可以解决问题:

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

正如其他人指出的那样,这几乎不是您想要的,即使它是问题中所问的。更安全的解决方案是根据删除bericht前删除表bericht。有关如何做到这一点,请参阅 CloudyMarble 答案。当我不想或无法删除并重新创建数据库本身时,我使用 bash 和我的帖子中的方法删除数据库中的所有表。

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

于 2014-04-25T12:25:14.133 回答
89

尝试这个:

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

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

于 2012-06-19T12:31:32.950 回答
12

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

于 2012-06-19T12:30:27.240 回答
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;

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

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

于 2020-08-18T05:58:40.633 回答
1

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

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

于 2017-02-05T10:19:29.033 回答
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”来避免不必要的并发症,但是您的设置可能需要不同的方法。

希望这可以帮助。

于 2017-05-09T10:31:27.730 回答