MySQL删除一些外键

Dre*_*rew 176 mysql constraints foreign-keys mysql-error-1025

我有一个表,其主键在其他几个表中使用,并有几个外键到其他表.

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;
Run Code Online (Sandbox Code Playgroud)

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

"ERROR 1025(HY000):重命名时出错"

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

pug*_*arx 423

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

alter table footable drop foreign key fooconstraint
Run Code Online (Sandbox Code Playgroud)

  • 这是我的问题.我现在觉得有点愚蠢.如果其他人有此问题,您可以使用SHOW CREATE TABLE函数找到外键约束名称. (32认同)
  • 提示:使用`SHOW CREATE TABLE footable;`来查看约束的名称.它不是列本身的名称.谢谢你的回答! (13认同)
  • 您可以使用它来查找外键约束:SELECT*FROM information_schema.table_constraints WHERE constraint_schema ='<your db name>'AND constraint_type ='FOREIGN KEY' (2认同)

zom*_*bat 21

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

我认为以下查询会这样做:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
Run Code Online (Sandbox Code Playgroud)


小智 15

如上所述,您可以轻松删除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
Run Code Online (Sandbox Code Playgroud)


小智 8

检查CONSTRAINT名称和FOREIGN KEY名称:

SHOW CREATE TABLE table_name;
Run Code Online (Sandbox Code Playgroud)

删除CONSTRAINT名称和FOREIGN KEY名称:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


小智 5

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

SHOW CREATE TABLE footable;
Run Code Online (Sandbox Code Playgroud)

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

ProjectsInfo_ibfk_1
Run Code Online (Sandbox Code Playgroud)

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

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;
Run Code Online (Sandbox Code Playgroud)

然后删除表列,

alter table ProjectsInfo drop column clientId;
Run Code Online (Sandbox Code Playgroud)