MySQL删除外键错误152。

14

我正在尝试使用以下代码删除多个外键:

ALTER TABLE `table` DROP FOREIGN KEY `fk_table_users1` , DROP FOREIGN KEY `fk_table_accounts1` , DROP FOREIGN KEY `fk_table_data1` ;

但是它返回了错误:

Error on rename of './db/table' to './db/#sql2-179c-288289' (errno: 152)

我已经运行了 SHOW ENGINE INNODB STATUS 命令,结果输出如下:

120725 12:38:37 Error in dropping of a foreign key constraint of table db/table,
in SQL command
ALTER TABLE `table` DROP FOREIGN KEY `fk_table_users1` , DROP FOREIGN KEY `fk_table_accounts1` , DROP FOREIGN KEY `fk_table_data1` 
Cannot find a constraint with the given id fk_table_users1.

SHOW CREATE TABLE 'table'输出:

CREATE TABLE `table` (
 `id` int(11) NOT NULL auto_increment,
 `data_id` int(11) NOT NULL,
 `account_id` int(11) NOT NULL,
 `status` enum('pending','complete') NOT NULL default 'pending',
 `created_at` datetime NOT NULL,
 `created_by` int(11) NOT NULL,
 PRIMARY KEY  (`id`),
 KEY `fk_orders_users1` (`created_by`),
 KEY `fk_orders_data1` (`data_id`),
 KEY `fk_orders_accounts1` (`account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

但是,当我通过phpmyadmin查看结构时,它列出了相同名称的外键。在删除外键之前,我需要做些其他事情吗?


请发布“SHOW CREATE TABLE table;”的输出。 - eggyal
@eggyal编辑了我的帖子并附上了输出结果。 - xylar
3
我看不到那里有任何外键约束... - eggyal
感谢您指出这一点。我们使用迁移脚本,看起来它没有添加外键。 - xylar
4个回答

12

没有外键。请参考MySQL文档,它说:

KEY is normally a synonym for INDEX.

所以基本上你创建了索引,而不是外键。点击此处获取外键信息。


一个小但可能很好的解决方案:我遇到了这个问题。使用这个答案,我仔细检查了自己的操作,并注意到我试图删除约束所需的KEY。在“drop”语句中进行一个小修复,将名称从键名更改为约束名 - 然后就完成了! - Boaz Rymland

2

您需要暂时取消约束以便删除它。

执行以下命令以关闭外键约束:

SET FOREIGN_KEY_CHECKS=0;

在删除外键后,再次执行以下命令以开启外键约束:

SET FOREIGN_KEY_CHECKS=1;


你可能指的是最后一行中的=1 ;) - AdrienW

0

索引名称和约束名称不能相同。您应该首先使用以下代码删除约束:ALTER TABLE tablename DROP FOREIGN KEY constraintname


0

先删除外键,然后再删除列

ALTER TABLE '表名' DROP FOREIGN KEY '约束ID';

如果您不知道约束ID,请在数据库转储中查找,该约束ID可在转储文件中找到..

然后再删除列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接