在 MySQL 中,我想删除一个表。
我尝试了很多东西,但一直收到无法删除名为 bericht
的表的错误。这是我得到的错误:
#1217 - 无法删除或更新父行:外键约束失败
如何删除此表?
这应该可以解决问题:
SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1;
正如其他人指出的那样,这几乎不是您想要的,即使它是问题中所问的。更安全的解决方案是在删除 bericht
之前删除依赖于 bericht
的表。有关如何做到这一点,请参阅 CloudyMarble 答案。当我不想或无法删除并重新创建数据库本身时,我使用 bash 和我的帖子中的方法删除数据库中的所有表。
当其他表对您尝试删除的表有外键约束并且您正在使用 InnoDB 数据库引擎时,会发生 #1217
错误。此解决方案暂时禁用检查约束,然后重新启用它们。阅读 documentation 了解更多信息。请务必根据 bericht
删除表中的外键限制和字段,否则您的数据库可能会处于损坏状态。
尝试这个:
SELECT *
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'YourTable';
这应该向您提供哪些表对您要删除的表的引用,一旦您删除这些引用,或者引用此表中数据集的数据集,您将能够删除该表
使用 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
但幸运的是,使用 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/
这可能与其他模式具有相同的表,这就是您收到该错误的原因。
您需要先删除子行,然后再删除父行。
我意识到这已经过时了一段时间,并且已经选择了一个答案,但是允许外键为 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”来避免不必要的并发症,但是您的设置可能需要不同的方法。
希望这可以帮助。
select * from information_schema.KEY_COLUMN_USAGE where referenced_table_name = 'table_to_delete';
返回一个空集。我认为这是 InnoDB 引擎的问题。该解决方案也适用于我的情况。