【问题标题】:Drop Column with foreign key in MySQL在 MySQL 中使用外键删除列
【发布时间】:2014-02-16 10:01:40
【问题描述】:

我有以下 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

我正在尝试使用以下内容从表中删除一列:

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)

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

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`))

现在我被困住了。我尝试了一些方法,但无法删除该列。除了删除列之外,我不允许以任何方式更改数据库。

【问题讨论】:

  • 使用SET FOREIGN_KEY_CHECKS = 0; 禁用约束

标签: mysql sql database database-design


【解决方案1】:

您的 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`

【讨论】:

    【解决方案2】:

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

    SHOW CREATE TABLE forms_main;
    

    然后一旦你得到密钥,执行删除外键命令

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

    然后执行drop column命令

    ALTER TABLE `forms_main` DROP `company_id`;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 关于改进 cmets 的建议:除了发布解决方案之外,还要添加几句话,说明它的作用、它的工作原理以及您可能推荐此解决方案而不是替代方案的原因。
      • 首先您需要使用以下查询删除外键: ALTER TABLE db_name.table_name DROP FOREIGN KEY foreign_key;在创建表时,将创建外键索引,也应使用以下查询将其删除: ALTER TABLE test.exam DROP INDEX id ;
      • 提示:您的答案正下方是一个“编辑”链接,可让您修改答案本身;)
      猜你喜欢
      • 2018-08-21
      • 2015-06-16
      • 2015-02-22
      • 2023-03-23
      • 2018-10-10
      • 1970-01-01
      • 2014-08-03
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多