在MySQL中删除具有外键的列

22

我有以下两张表:

CREATE TABLE `personal_info` (
 `p_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` text NOT NULL,
 `initials` text NOT NULL,
 `surname` text NOT NULL,
 `home_lang` int(11) NOT NULL,
 PRIMARY KEY (`p_id`),
 KEY `home_lang` (`home_lang`),
 CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=latin1

CREATE TABLE `language_list` (
 `ll_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` text NOT NULL,
 PRIMARY KEY (`ll_id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=latin1

我正在尝试使用以下代码从表格中删除一列:

ALTER TABLE `personal_info` DROP `home_lang`

但是我无法这样做,因为我收到了以下错误:

#1025 - Error on rename of '.\MyDB\#sql-112c_82' to '.\MyDB\personal_info' (errno: 150)

我已经尝试过先删除索引,然后使用以下代码删除列:

ALTER TABLE personal_info DROP INDEX home_lang

但是我遇到了以下错误:

#1553 - Cannot drop index 'home_lang': needed in a foreign key constraint 

所以我尝试删除外键:

ALTER TABLE personal_info DROP FOREIGN KEY home_lang

但是收到了这个错误:

#1025 - Error on rename of '.\MyDB\personal_info' to '.\MyDB\#sql2-112c-8d' (errno: 152)

我也尝试过先将所有值设为 null:

update personal_info set home_lang = null

但是随后收到了这个错误:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`MyDB`.`personal_info`, CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`))

现在我卡住了。我尝试了一些方法,但就是无法删除该列。除了删除该列,我不允许以任何其他方式更改数据库。


1
使用 SET FOREIGN_KEY_CHECKS = 0; 命令来禁用约束。 - Grijesh Chauhan
3个回答

32

你的DROP FOREIGN KEY语法使用了错误的键名。它试图删除home_lang字段上的“普通”索引,而不是外键本身。

CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`)
            ^^^^^^^^^^^^^^^^^^^^^--- THIS is the name of the foreign key

尝试:

ALTER TABLE personal_info DROP FOREIGN KEY `personal_info_ibfk_1`

12

使用以下查询语句查找外键的名称。

SHOW CREATE TABLE forms_main;

然后,一旦您获得了关键信息,请执行“drop foreign key”命令。

alter TABLE `forms_main`
drop FOREIGN key `forms_main_ibfk_1`;

然后执行删除列的命令

ALTER TABLE `forms_main` DROP `company_id`;

1

修改表 db_name.table_name,删除外键 foreign_key; 修改表 test.exam,删除索引 id


1
改进您的注释建议:除了发布解决方案外,还应添加一些关于此操作的说明,为什么它有效以及为什么您推荐此解决方案而不是其他替代方案。 - creinig
首先,您需要使用以下查询删除外键: ALTER TABLE db_name.table_name DROP FOREIGN KEY foreign_key;在创建表时,会创建外键索引,应该使用以下查询将其删除: ALTER TABLE test.exam DROP INDEX id; - Hithaisri M K
提示:您的答案正下方有一个“编辑”链接,可以修改答案本身 ;) - creinig

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