我收到此错误消息:
第 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
命令 :-?)
CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)
,即表引用上没有模式名称:-?
按需,现在作为答案...
使用 MySQL Query Browser 或 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
用作额外安全措施的地方...
两种可能:
在另一个模式(mysql 术语中的“数据库”)中有一个表,它有一个 FK 引用 innodb 内部数据字典与 mysql 不同步。
您可以通过在删除失败后执行“SHOW ENGINE INNODB STATUS”来查看它是哪个表(无论如何是其中一个)。
如果结果是后一种情况,如果可以的话,我会转储并恢复整个服务器。
MySQL 5.1 及更高版本将在错误消息中为您提供带有 FK 的表的名称。
SHOW ENGINE INNODB STATUS
报告了什么。
禁用外键检查
SET FOREIGN_KEY_CHECKS=0
SET FOREIGN_KEY_CHECKS=0
,它确实修复了错误消息。您知道为什么需要这样做吗?即使在表消失后,外键是否也会被缓存?
SET FOREIGN_KEY_CHECKS=1;
!
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 用作额外的安全措施...
来自 this blog:
您可以暂时禁用外键检查:
SET FOREIGN_KEY_CHECKS=0;
一旦你搞砸了,一定要恢复它们:
SET FOREIGN_KEY_CHECKS=1;
希望它的工作
SET foreign_key_checks = 0;删除表 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`;
我找到了一个简单的解决方案,导出数据库,在文本编辑器中编辑您想要编辑的内容,然后导入它。完毕
CREATE TABLE
代码并再次加载转储...不会使 MySQL 删除表。如果你的意思是在一个新的数据库中恢复转储......如果你想像我一样清除所有的表,一个新创建的数据库已经是空的。如果您想保留一些表,此处提到的 SET FOREIGN_KEY_CHECKS=0
解决方法可以正常工作并且更简单;并且您可能无论如何都不需要编辑转储,因为您的数据的新副本可能没有不同步的数据字典。
无法删除或更新父行:外键约束失败(table1
.user_role
、CONSTRAINT FK143BF46A8dsfsfds@#5A6BD60
FOREIGN KEY (user_id
) REFERENCES user
(id
))
我做了两个简单的步骤。首先我删除子表中的子行,例如
mysql> 从 table2 中删除其中 role_id = 2 && user_id =20;
查询正常,1 行受影响(0.10 秒)
第二步是删除父级
从 id = 20 的 table1 中删除;
查询正常,1 行受影响(0.12 秒)
通过这个我解决了问题,这意味着删除孩子然后删除父母
我希望你明白了。 :)
SET FOREIGN_KEY_CHECKS=0;
添加到转储的开头。