ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


i
informatik01

正如 here 所解释的,似乎 foreign key 约束必须由 constraint name 而不是 index 名称删除。

语法是:

ALTER TABLE footable DROP FOREIGN KEY fooconstraint;

这是我的问题。我现在觉得有点傻。如果其他人有这个问题,您可以使用 SHOW CREATE TABLE 函数找到外键约束名称。
提示:使用 SHOW CREATE TABLE footable; 查看约束的名称。它本身不是列的名称。感谢你的回答!
您可以使用它来查找外键约束: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '' AND constraint_type = 'FOREIGN KEY'
d
davmos

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

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

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

A
Adam Michalik

正如上面每个人所说,您可以轻松删除 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

'the_same_name_as_above' 不起作用。请参阅@norodin 答案,它对我有用。
n
norodin

检查什么是 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;

希望这可以帮助!


P
Pratik Gaurav

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

SHOW CREATE TABLE footable;

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

ProjectsInfo_ibfk_1

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

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

然后删除表格列,

alter table ProjectsInfo drop column clientId;

R
Rock King Kirant

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


A
Abinash Hota

如果您的表使用 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


C
Community

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

类似的问题已被问过 here。另请查看 here 了解更多信息。


那么,因为 assignmentStuff 引用了 assignment 的主键,我不能删除 assignment 的 locationID 列吗?这似乎有点违反直觉。
看来我已经切换了一些列名,所以我的回答并没有真正的意义。对不起……
R
Robert Columbia

尝试这个:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E

d
david

第 1 步:show create table vendor_locations;

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

它对我有用。


O
Owais Akber

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

SHOW CREATE TABLE TABLE_NAME

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

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

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