Bogus foreign key constraint fail

19 浏览
0 Comments

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`命令 :-?)

0
0 Comments

(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"下的数据库。

0
0 Comments

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,请根据您的评论提供一个答案,因为似乎有更多的人支持您的观点。

0
0 Comments

问题的出现原因是使用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"选项来自动添加相应的语句。不过需要注意的是,使用这个解决方法时需要确保所有指向被删除表的表也会被删除,以维护数据库的一致性。

0