Mysql 伪外键约束失败
我收到以下错误消息: 第40行的错误1217(23000):无法 删除或更新父行:a 外键约束失败 。。。当我试图放下桌子时:Mysql 伪外键约束失败,mysql,innodb,Mysql,Innodb,我收到以下错误消息: 第40行的错误1217(23000):无法 删除或更新父行:a 外键约束失败 。。。当我试图放下桌子时: 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, `descri
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;
有趣的是,我已经删除了模式中所有其他表,这些表在区域
上有外键。实际上,除了区域
表之外,数据库是空的
如果数据库中没有任何其他对象,它怎么可能有子行?据我所知,InnoDB不允许在其他模式上使用外键,是吗
(我甚至可以运行
将表区域重命名为其他内容
命令:-?)禁用外键检查
SET FOREIGN_KEY_CHECKS=0
两种可能性:
MySQL 5.1及更高版本将在错误消息中为您提供带有FK的表名。可能您以前使用此表时收到错误。您可以重命名该表并再次尝试删除它
ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
随需应变,现在作为回答
当使用MySQL查询浏览器或phpMyAdmin时,似乎会为每个查询()打开一个新连接,因此有必要在一个查询中写入所有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;
其中,设置外键检查=1
用作额外的安全措施 来自:
您可以暂时禁用外键检查:
SET FOREIGN_KEY_CHECKS=0;
只要确保在你搞乱之后恢复它们:
SET FOREIGN_KEY_CHECKS=1;
希望它的工作
设置外键检查=0;
删除表格表格名称
;
设置外键检查=1 在Rails上,可以使用
Rails控制台执行以下操作:
connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
无法删除或更新父行:外键约束失败(table1
user\u role
,约束FK143BF46A8dsfsfds@#5A6BD60
外键(user\u id
)引用user
(id
)
我用了两个简单的步骤。首先,我删除子表中的子行,如
mysql>从表2中删除,其中角色\u id=2&&user\u id=20
查询正常,1行受影响(0.10秒)
第二步是删除父级
从表1中删除,其中id=20
查询正常,1行受影响(0.12秒)
这样我就解决了先删除子对象,再删除父对象的问题
我希望你明白了 我找到了一个简单的解决方案,导出数据库,在文本编辑器中编辑想要编辑的内容,然后导入。完成正确的命令似乎是SET FOREIGN\u KEY\u CHECKS=0
,它确实修复了错误消息。你知道为什么需要这样做吗?即使在表消失之后,外键是否仍被缓存?老实说,我不知道为什么会出现这样的问题,但请确保在每次进行重大更改或更新时禁用密钥检查。这种情况在我身上发生过好几次,让我好几天都没有睡觉。请确保将FOREIGN\u KEY\u CHECKS设置为1代码>完成后!当使用MySQL查询浏览器或phpMyAdmin时,似乎为每个查询()打开了一个新连接,因此有必要在一个查询中写入所有drop语句,例如,SET FOREIGN\u KEY\u CHECKS=0;将表格my_第一张表格放置到DROP;放下我的桌子,放下第二张桌子;设置外键检查=1代码>其中设置外键检查=1作为额外的安全措施…@KarlisRode,关于phpMyAdmin的评论太棒了。如果你把它作为一个答案,我会+1它。这个表可能是另一个模式中引用完整性关系的一部分吗?我有一些应用程序的其他副本,所以它总是可能的。但是,我使用的语法基本上是CONSTRAINT fk_servicio_area1外键(area_id)引用area(area_id)
,即表引用上没有架构名称:-?我无法再重现该问题。不同步字典是一个可能的原因。我将在第二天测试它,看看显示引擎INNODB状态的报告。谢谢您的回答!我有一个多对多表仍在引用我们无法删除的表,因此我必须先删除该表。SHOW ENGINE INNODB STATUS在“LATEST foreign key error”下列出最后一个外键错误。这有一个时间戳。可能有一个表仍然具有主题表的引用键。就我而言,就像这样,节省了很多时间。在“最新外键错误”下删除了db对于那些使用phpMyAdmin创建转储的人,有一个选项“禁用外键检查”,它将自动添加设置外键检查=0代码>到转储的开头。似乎phpMyAdmin已经实现了这个可爱的功能,现在我正在等待mysqlWorkbench也这么做!:)@仅供参考,我接受了MarkR的回答,因为它为这个问题提供了一个有意义的解释,尽管我承认我无法验证它,因为我在接下来的6年里没有遇到过同样的问题,甚至一次也没有。此答案和之前的答案提供了一个变通方法(非常好),但不要真正解决问题本身,因为你只能接受我必须选择的一个答案。警告:这不是解决方案,只是懒人的变通方法。使用此选项后(其他一些表上的记录指向被删除的表),您将体验到外键悬空,这会致命地破坏数据库的一致性(in),并且应用程序将开始到处抛出异常。我已经警告过你了。虽然我相信bekce的警告应该得到理解和注意,但这个解决方案确实对我有用,因为我对这个问题很有信心