删除具有外键的列

9
在我的mysql数据库中,使用inno_db引擎,我有一个带有外键的表。我想删除该列(当然还包括外键和相关索引 - 我不需要整个列!)
现在,简单地删除它会产生错误: 一般错误:1025重命名'.\road_dmy#sql-19d8_2be'为'.\road_dmy\contact'时出错(errno: 150)
听起来这是一个已知问题。 http://bugs.mysql.com/bug.php?id=15317 但无论如何,我应该怎么做才能删除这个列?我非常确定否则没有人会使用这个数据库
(顺便说一下,我如何知道上面神秘错误消息的真实细节?)

你必须先删除键。发布命令“show create table contact;”的结果,我们将能够给出确切的命令。 - Asaph
是的,只需先删除密钥即可完成任务。 - shealtiel
请不要在问题标题中写标签。 - Lightness Races in Orbit
2个回答

10

首先,您必须先删除密钥。我不知道您的表的名称,但我将通过示例给出一般策略。假设您有以下两个InnoDB表:

CREATE TABLE `A` (
   `id` int(10) unsigned NOT NULL auto_increment,
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

CREATE TABLE `B` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `a_id` int(10) unsigned NOT NULL,
    PRIMARY KEY  (`id`),
    KEY `a_id` (`a_id`),
    CONSTRAINT `b_ibfk_1` FOREIGN KEY (`a_id`) REFERENCES `a` (`id`)
) ENGINE=InnoDB;

您可以使用以下命令在表B中删除a_id列:
alter table B drop foreign key b_ibfk_1, drop column a_id;

1
要查看与表相关的所有外键,请使用以下命令:
mysql> show create table <your_table_name>;

这个命令将输出包含外键约束的创建表查询,例如:
       Table: <your_table_name>
Create Table: CREATE TABLE `<your_table_name>` (
  `id` int DEFAULT NULL,
  `parent_id` int DEFAULT NULL,
  `unwanted_col` int DEFAULT NULL, 
  KEY `unwanted_col` (`unwanted_col`),
  CONSTRAINT `<your_table_name>_ibfk_1` FOREIGN KEY (`unwanted_col`)
  REFERENCES `parent_table` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

现在使用以下命令来删除外键关系:
mysql> ALTER TABLE <your_table_name> DROP FOREIGN KEY `<your_table_name>_ibfk_1`;

既然你的外键关系已经消失了,你可以安全地删除这一列。
ALTER TABLE <your_table_name> DROP COLUMN unwanted_col;

请参考: 删除外键约束

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