MySQL删除某些外键。

228

我有一张表,其主键用于多个其他表,并且有多个外键指向其他表。

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)时,它会给出一个错误。

"ERROR 1025 (HY000): Error on rename"

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

11个回答

524

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

语法如下:

ALTER TABLE footable DROP FOREIGN KEY fooconstraint;

43
这是我的问题,现在感觉有点蠢。如果其他人也遇到这个问题,你可以使用SHOW CREATE TABLE函数来查找外键约束的名称。 - Drew
20
提示:使用 SHOW CREATE TABLE footable; 查看约束的名称,它并不是列名本身。感谢您的回答! - Chris Baker
3
你可以使用以下语句查找外键约束: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<你的数据库名>' AND constraint_type = 'FOREIGN KEY' - Gayan Dasanayake

21

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

我认为以下查询将实现此功能:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

18

正如其他人所说,您可以轻松删除外键。但是,我刚刚注意到,在某些情况下需要删除键本身。如果您遇到任何创建另一个具有相同名称的索引的错误消息,那么删除与该索引相关的所有内容将非常有用。

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

“the_same_name_as_above”不起作用。请查看@norodin的答案,这对我有用。 - csr-nontol

17

检查约束名和外键名:

SHOW CREATE TABLE table_name;

移除约束名和外键名:

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

希望这能有所帮助!


5

嗨,我按照上面的步骤,找到了一些解决方案。

SHOW CREATE TABLE footable;

您将获得类似于FK约束名称的内容。
ProjectsInfo_ibfk_1

现在,您需要通过修改表命令来删除这些约束。

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

然后删除表列。
alter table ProjectsInfo drop column clientId;

4

这里提供了一种删除外键约束的方法,可以正常工作。 ALTER TABLE location.location_id DROP FOREIGN KEY location_ibfk_1;


1

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

SHOW CREATE TABLE TABLE_NAME

这个查询将会得到外键的约束名,下面的查询将会删除它。

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

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

1
您通常会在使用InnoDB引擎的表中出现此错误。在这种情况下,您需要删除外键,然后进行alter table并删除该列。

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

SHOW CREATE TABLE region; 这应该会向您显示一行,在左上角单击+选项,然后单击完整文本单选按钮,然后单击go。您将获得索引名称,类似于:

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

alter table region drop foreign key region_ibfk_1;

或者

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

记住,唯一需要做的就是在您的表名后添加_ibfk_1,使其变成这样:- TableName_ibfk_1


0

试试这个:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E

0
步骤1:show create table vendor_locations; 步骤2:ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1; 这对我有用。

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