伪造的外键约束失败

我得到这个错误消息:

在行40错误1217(23000):无法删除或更新父行:外键约束失败

…当我尝试放下一张桌子时:

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可以运行RENAME TABLE area TO something_else命令: – ?)

两种可能性:

  1. 在另一个模式(mysql术语中的“数据库”)中有一个表,它具有FK引用
  2. innodb内部数据字典与mysql不同步。

您可以通过在丢弃失败后执行“SHOW ENGINE INNODB STATUS”来查看它是哪个表(其中之一)。

如果事实certificate是后一种情况,我会转储并恢复整个服务器,如果可以的话。

MySQL 5.1及更高版本会在错误信息中给你带有FK的表的名字。

按要求,现在作为答案…

当使用MySQL查询浏览器或phpMyAdmin时,似乎会为每个查询( bugs.mysql.com/bug.php?id=8280 )打开一个新的连接,因此需要在一个查询中写入所有的drop语句,例如。

 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作为额外的安全措施…

禁用外键检查

 SET FOREIGN_KEY_CHECKS=0 

从这个博客 :

您可以暂时禁用外键检查:

 SET FOREIGN_KEY_CHECKS=0; 

只要一旦你搞定了,就一定要恢复它们:

 SET FOREIGN_KEY_CHECKS=1; 

希望它的工作

SET foreign_key_checks = 0; DROP TABLE table name ; SET foreign_key_checks = 1;

在Rails上,可以使用rails console执行以下操作:

 connection = ActiveRecord::Base.connection connection.execute("SET FOREIGN_KEY_CHECKS=0;") 

也许您在使用此表之前收到错误。 您可以重命名表并尝试再次删除它。

 ALTER TABLE `area` RENAME TO `area2`; DROP TABLE IF EXISTS `area2`; 

我find了一个简单的解决scheme,导出数据库,在文本编辑器中编辑你想要编辑的内容,然后导入它。 完成

无法删除或更新父行:外键约束失败( FK143BF46A8dsfsfds@#5A6BD60 ,CONSTRAINT FK143BF46A8dsfsfds@#5A6BD60 FOREIGN KEY( user_id )REFERENCES userid ))

我在两个简单的步骤中做了什么。 首先我删除子表中的子行

mysql>从table2删除where role_id = 2 && user_id = 20;

查询OK,1行受影响(0.10秒)

第二步是删除父项

从table1删除其中id = 20;

查询OK,1行受影响(0.12秒)

通过这个我解决的问题,这意味着删除孩子,然后删除父母

我希望你明白了。 🙂