我收到此错误消息:
第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作为额外的安全措施......
Mar*_*rkR 101
两种可能性:
在丢弃失败后,您可以通过执行"SHOW ENGINE INNODB STATUS"来查看它是哪个表(无论如何).
如果结果是后一种情况,我会转储并恢复整个服务器,如果可以的话.
MySQL 5.1及更高版本将在错误消息中为您提供带有FK的表的名称.
Fla*_*yqi 47
禁用外键检查
SET FOREIGN_KEY_CHECKS=0
Run Code Online (Sandbox Code Playgroud)
小智 28
来自这个博客:
您可以暂时禁用外键检查:
SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)
一旦你搞得一团糟,一定要恢复它们:
SET FOREIGN_KEY_CHECKS=1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
219234 次 |
| 最近记录: |