MySQL删除一些外键


189

我有一个表,该表的主键在其他几个表中使用,并且对其他表有几个外键。

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):重命名错误”

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

Answers:


446

正如解释在这里,似乎外键约束必须由被丢弃的约束名称,而不是索引名。语法为:

alter table footable drop foreign key fooconstraint

35
这是我的问题。我现在有点傻。如果其他任何人都有此问题,则可以使用SHOW CREATE TABLE函数找到外键约束名称。
德鲁

14
提示:用于SHOW CREATE TABLE footable;查看约束的名称是什么。它不是列本身的名称。感谢你的回答!
克里斯·贝克

2
您可以使用此找到外键约束:SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<你的数据库名称>' AND constraint_type = '的外键'
加扬Dasanayake

21

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

我认为以下查询可以做到:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

就像上面的所有人所述,您可以轻松删除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

10

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

SHOW CREATE TABLE table_name;

删除约束名称和外键名称:

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

希望这可以帮助!


4

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


2

嘿,我按照上面的顺序进行操作,找到了解决方法。

SHOW CREATE TABLE footable;

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

ProjectsInfo_ibfk_1

现在您需要删除此约束。通过alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

然后删除表格列,

alter table ProjectsInfo drop column clientId;

1

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

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

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

CONSTRAINT region_ibfk_1 FOREIGN KEY(country_id)参考国家(id)开删除不采取行动更新不采取行动现在只需发出以下命令:

alter table region drop外键region_ibfk_1;

要么

更简单地说,只需键入:-alter table TableName删除外键 TableName_ibfk_1 ;

记住唯一的事情是 在表后添加 _ibfk_1,使其像这样:-TableName _ibfk_1


0

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

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


1
因此,由于AssignmentStuff引用了工作分配的主键,因此无法删除工作分配的locationID列?这似乎有点反常。
德鲁

看来我已经切换了一些列名,所以我的答案实际上没有任何意义。抱歉...
罗纳德·威登伯格2009年


0

第1步: show create table vendor_locations;

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

它为我工作。


0

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

SHOW CREATE TABLE TABLE_NAME

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

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.