在MySQL中使用外键删除列

Edu*_*ker 10 mysql sql database database-design

我有以下2个表格:

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

我试图从表中删除列,具有以下内容:

ALTER TABLE `personal_info` DROP `home_lang`
Run Code Online (Sandbox Code Playgroud)

但是因为我收到这个错误所以不能这样做:

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

我试图先删除索引,然后删除列:

ALTER TABLE personal_info DROP INDEX home_lang
Run Code Online (Sandbox Code Playgroud)

但后来我收到以下错误:

#1553 - Cannot drop index 'home_lang': needed in a foreign key constraint 
Run Code Online (Sandbox Code Playgroud)

所以我试着删除外键:

ALTER TABLE personal_info DROP FOREIGN KEY home_lang
Run Code Online (Sandbox Code Playgroud)

但收到此错误:

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

我还试图首先将所有值设置为null:

update personal_info set home_lang = null
Run Code Online (Sandbox Code Playgroud)

但后来收到了这个错误:

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

而现在我被卡住了.我尝试过一些东西但是无法删除列.除了删除列之外,我不允许以任何方式更改数据库.

Mar*_*c B 24

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

尝试:

ALTER TABLE personal_info DROP FOREIGN KEY `personal_info_ibfk_1`
Run Code Online (Sandbox Code Playgroud)


Aks*_*aik 5

使用下面给出的查询来查找外键的名称。

SHOW CREATE TABLE forms_main;
Run Code Online (Sandbox Code Playgroud)

然后一旦你得到了密钥,就执行 drop外键命令

alter TABLE `forms_main`
drop FOREIGN key `forms_main_ibfk_1`;
Run Code Online (Sandbox Code Playgroud)

然后执行drop column命令

ALTER TABLE `forms_main` DROP `company_id`;
Run Code Online (Sandbox Code Playgroud)