Bogus foreign key constraint fail
Bogus foreign key constraint fail
当我尝试删除一个表时,出现了以下错误信息:
错误 1217 (23000) 在第40行: 无法删除或更新父行: 外键约束失败
... 这是在我尝试删除一个表时出现的:
DROP TABLE IF EXISTS `area`;
... 定义如下:
CREATE TABLE `area` ( `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL, `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL, `descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL, PRIMARY KEY (`area_id`), UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
有趣的是,我已经删除了模式中的所有其他具有对`area`的外键的表。实际上,除了`area`表之外,数据库是空的。
如果数据库中没有其他对象,它怎么可能有子行呢?据我所知,InnoDB不允许在其他模式上使用外键,对吗?
(我甚至可以运行`RENAME TABLE area TO something_else`命令 :-?)
(Bogus foreign key constraint fail)这个问题的出现的原因可能有两种:
1. 在另一个模式(在mysql术语中称为“数据库”)中有一个表具有外键参考。
2. innodb内部数据字典与mysql的数据字典不同步。
当删除操作失败后,可以通过执行"SHOW ENGINE INNODB STATUS"命令来查看是哪个表引发了这个问题。
如果是第二种情况,建议尽可能地导出并恢复整个服务器。
MySQL 5.1及以上版本会在错误消息中提供包含外键的表的名称。
我无法再次重现这个问题。不同步的数据字典似乎是一个可能的原因。我会在今天进行测试,并查看"SHOW ENGINE INNODB STATUS"的报告。
非常感谢您的回答!我发现还有一个多对多的表仍然引用了我们无法删除的表,所以我必须先删除那个表。
"SHOW ENGINE INNODB STATUS"命令会在"LATEST FOREIGN KEY ERROR"下列出最后一个外键错误,其中包含一个时间戳。
可能还有一个表仍然具有对主题表的引用键。在我的情况下就是这样。
非常节省时间。我删除了"LATEST FOREIGN KEY ERROR"下的数据库。
Bogus foreign key constraint fail(虚假的外键约束失败)的问题是由于外键约束导致的,解决方法是禁用外键检查。
在MySQL中,可以通过执行SET FOREIGN_KEY_CHECKS=0
来禁用外键检查。这个命令可以解决错误信息。不知道为什么需要这样做?是否在表被删除后外键仍然被缓存?
说实话,我不知道为什么会出现这样的问题,但是请确保在进行大的更改或更新时禁用键检查。我已经遇到过几次这种情况,让我几天没有睡眠。
在完成后,请确保执行SET FOREIGN_KEY_CHECKS=1;
。
当使用MySQL Query Browser或phpMyAdmin时,每个查询似乎会打开一个新的连接,这使得在一个查询中编写所有的删除语句变得必要,例如:SET FOREIGN_KEY_CHECKS=0; DROP TABLE my_first_table_to_drop; DROP TABLE my_second_table_to_drop; SET FOREIGN_KEY_CHECKS=1;
其中的SET FOREIGN_KEY_CHECKS=1作为额外的安全措施...
对于phpMyAdmin的评论,非常好。如果你将其作为答案发布,我会点赞。
@ÁlvaroG.Vicario,请根据您的评论提供一个答案,因为似乎有更多的人支持您的观点。
问题的出现原因是使用MySQL Query Browser或phpMyAdmin时,每个查询都会打开一个新的连接,这使得必须将所有的drop语句写在一个查询中。解决方法是在查询的开头添加SET FOREIGN_KEY_CHECKS=0;
来禁用外键检查,然后在查询的结尾添加SET FOREIGN_KEY_CHECKS=1;
来启用外键检查。对于使用phpMyAdmin创建转储文件的用户,可以选择"Disable foreign key checks"选项,这将自动在转储文件的开头添加SET FOREIGN_KEY_CHECKS=0;
。
这个问题的解决方法比较简单,只需要在查询中添加对应的语句即可。不过需要注意的是,如果使用了上述的解决方法,但是存在其他表指向被删除的表,将会导致数据库的一致性破坏,应用程序将会出现异常。因此,在使用这个解决方法之前,需要确保所有指向被删除表的表也会被删除。
总结一下,解决这个问题的方法是在查询中添加SET FOREIGN_KEY_CHECKS=0;
来禁用外键检查,并在查询结束时添加SET FOREIGN_KEY_CHECKS=1;
来启用外键检查。对于使用phpMyAdmin的用户,可以选择"Disable foreign key checks"选项来自动添加相应的语句。不过需要注意的是,使用这个解决方法时需要确保所有指向被删除表的表也会被删除,以维护数据库的一致性。