在 MySQL 中,我想删除一个表。我尝试了很多东西,但我一直收到无法删除
名为 table 的错误。bericht
这是我得到的错误:
#1217 - 无法删除或更新父行:外键约束失败
如何删除此表?
在 MySQL 中,我想删除一个表。我尝试了很多东西,但我一直收到无法删除
名为 table 的错误。bericht
这是我得到的错误:
#1217 - 无法删除或更新父行:外键约束失败
如何删除此表?
这应该可以解决问题:
SET FOREIGN_KEY_CHECKS=0; DROP TABLE bericht; SET FOREIGN_KEY_CHECKS=1;
正如其他人指出的那样,这几乎不是您想要的,即使它是问题中所问的。更安全的解决方案是根据删除bericht
前删除表bericht
。有关如何做到这一点,请参阅 CloudyMarble 答案。当我不想或无法删除并重新创建数据库本身时,我使用 bash 和我的帖子中的方法删除数据库中的所有表。
#1217
当其他表对您尝试删除的表具有外键约束并且您正在使用 InnoDB 数据库引擎时,会发生该错误。此解决方案暂时禁用检查约束,然后重新启用它们。阅读文档以获取更多信息。请务必根据 删除表中的外键限制和字段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”来避免不必要的并发症,但是您的设置可能需要不同的方法。
希望这可以帮助。