伪造的外键约束失败
我得到这个错误消息:
在行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
命令: – ?)
两种可能性:
- 在另一个模式(mysql术语中的“数据库”)中有一个表,它具有FK引用
- 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 user
( id
))
我在两个简单的步骤中做了什么。 首先我删除子表中的子行
mysql>从table2删除where role_id = 2 && user_id = 20;
查询OK,1行受影响(0.10秒)
第二步是删除父项
从table1删除其中id = 20;
查询OK,1行受影响(0.12秒)
通过这个我解决的问题,这意味着删除孩子,然后删除父母
我希望你明白了。 🙂