虚假外键约束失败

Álv*_*lez 110 mysql innodb

我收到此错误消息:

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

......当我试图放桌子时:

DROP TABLE IF EXISTS `area`;
Run Code Online (Sandbox Code Playgroud)

......定义如下:

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;
Run Code Online (Sandbox Code Playgroud)

有趣的是,我已经删除了具有外键的架构中的所有其他表area.实际上,除了area表之外,数据库是空的.

如果数据库中没有任何其他对象,它怎么可能有子行?据我所知,InnoDB不允许在其他模式上使用外键,是吗?

(我甚至可以运行RENAME TABLE area TO something_else命令: - ?)

Kar*_*ode 121

根据需求,现在作为答案......

当使用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; 
Run Code Online (Sandbox Code Playgroud)

在哪里SET FOREIGN_KEY_CHECKS=1作为额外的安全措施......

  • 对于那些使用phpMyAdmin创建转储的人,有一个选项"禁用外键检查",它会自动将`SET FOREIGN_KEY_CHECKS = 0;`添加到转储的开头. (2认同)

Mar*_*rkR 101

两种可能性:

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

在丢弃失败后,您可以通过执行"SHOW ENGINE INNODB STATUS"来查看它是哪个表(无论如何).

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

MySQL 5.1及更高版本将在错误消息中为您提供带有FK的表的名称.

  • SHOW ENGINE INNODB STATUS列出"LATEST FOREIGN KEY ERROR"下的最后一个外键错误.这有一个时间戳. (5认同)
  • 谢谢你的回答!我有一个多对多的表仍然引用我们无法删除的表,所以我不得不首先丢弃该表. (3认同)

Fla*_*yqi 47

禁用外键检查

SET FOREIGN_KEY_CHECKS=0
Run Code Online (Sandbox Code Playgroud)

  • 正确的命令似乎是`SET FOREIGN_KEY_CHECKS = 0`,它确实修复了错误消息.你知道为什么需要这个吗?即使在表格消失后外键是否被缓存? (62认同)
  • 完成后确保`SET FOREIGN_KEY_CHECKS = 1;`! (55认同)
  • 使用MySQL查询浏览器或phpMyAdmin时,似乎为每个查询打开了一个新连接(http://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用作额外的安全措施... (5认同)

小智 28

来自这个博客:

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

SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

一旦你搞得一团糟,一定要恢复它们:

SET FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)


M_ *_* Fa 6

希望它的工作

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