217

我有一个表,它的主键用于其他几个表,并且有几个外键到其他表。

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

问题是,当我尝试删除其中一个外键列(即 locationIDX)时,它会给我一个错误。

“错误 1025 (HY000):重命名错误”

如何在不出现此错误的情况下删除上面分配表中的列?

4

11 回答 11

506

正如这里所解释的,似乎外键约束必须通过约束名称而不是索引名称来删除。

语法是:

ALTER TABLE footable DROP FOREIGN KEY fooconstraint;
于 2009-05-08T05:54:54.117 回答
21

外键用于确保数据完整性,因此只要列是外键的一部分,就不能删除它。您需要先放下钥匙。

我认为以下查询会做到这一点:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
于 2009-05-08T05:50:20.727 回答
17

正如上面每个人所说,您可以轻松删除 FK。但是,我只是注意到在某些时候可能有必要删除 KEY 本身。如果您有任何错误消息要创建另一个索引,例如最后一个索引,我的意思是使用相同的名称,删除与该索引相关的所有内容会很有用。

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above
于 2016-01-03T08:42:31.117 回答
15

检查什么是 CONSTRAINT 名称和 FOREIGN KEY 名称:

SHOW CREATE TABLE table_name;

删除 CONSTRAINT 名称和 FOREIGN KEY 名称:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

希望这可以帮助!

于 2017-01-22T03:26:40.457 回答
5

嘿,我按照上面的一些顺序,找到了一些解决方案。

SHOW CREATE TABLE footable;

您将获得 FK 约束名称,例如

ProjectsInfo_ibfk_1

现在您需要删除此约束。通过更改表命令

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

然后删除表格列,

alter table ProjectsInfo drop column clientId;
于 2019-10-16T08:04:12.730 回答
4

这是一种删除外键约束的方法,它会起作用。更改表locationlocation_id 删除外键location_ibfk_1

于 2014-05-05T10:10:36.243 回答
1

如果您的表使用 InnoDB 引擎,您通常会收到此错误。在这种情况下,您必须删除外键,然后执行更改表并删除列。

但棘手的部分是您不能使用列名删除外键,而是必须找到用于索引它的名称。要找到它,请发出以下选择:

显示创建表区域;这应该会显示一行,在左上角单击 + 选项,单击全文 raio 按钮,然后单击 go。您将获得索引的名称,如下所示:

CONSTRAINT region_ibfk_1 FOREIGN KEY (country_id) REFERENCES country (id) ON DELETE NO ACTION ON UPDATE NO ACTION 现在只需发出:

更改表区域删除外键 region_ibfk_1;

或者

更简单地输入:- alter table TableName drop foreign key TableName_ibfk_1 ;

记住唯一的事情是在你的表名之后添加 _ibfk_1 来制作这样的:- TableName _ibfk_1

于 2017-08-09T10:20:52.677 回答
0

您不能删除外键列,因为它是从表中引用的assignmentStuff。所以你应该先去掉外键约束assignmentStuff.assignmentIDX

这里已经提出了一个类似的问题。也可以在这里查看更多信息。

于 2009-05-08T05:49:49.090 回答
0

试试这个:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
于 2015-10-24T14:32:32.503 回答
0

第1步:show create table vendor_locations;

第2步:ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

它对我有用。

于 2018-07-31T02:05:33.463 回答
0

首先需要通过此查询获取实际的约束名称

SHOW CREATE TABLE TABLE_NAME

此查询将导致外键名称的约束,现在下面的查询将删除它。

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

上面约束名称中的最后一个数字取决于表中有多少外键

于 2020-04-02T06:06:18.923 回答