无法在MySQL中删除外键

47

我曾经在课程和讲师之间建立了一对多的关系,但现在想要删除这个关系。当我试图在课程表中删除讲师ID时,系统提示我无法删除,因为它是一个外键。于是我决定采用以下方法进行删除:

ALTER TABLE course DROP FOREIGN KEY instructorID

但是我遇到了这个错误:
#1091 - Can't DROP 'InstructorID'; check that column/key exists 

我不明白这个错误的意思。我做错了什么吗?

2
你需要先删除子列,然后再删除父列。能否请提供一个模式图? - Harry
你可以从链接http://stackoverflow.com/questions/4414653/check-column-key-exists获取帮助。 - Gopal Joshi
7个回答

88
请运行SHOW CREATE TABLE course;,以确保instructorID是外键约束的名称。
额外说明: 该错误意味着MySQL搜索名为"InstructorID"的外键约束,但没有这样的约束。也许这是你列的名字,但你必须使用约束名来删除外键。

45

运行SHOW CREATE table course;之后,您应该找到类似于以下的常见外键符号:

(course_ibfk_1) 

根据您使用的MySQL版本可能会有所不同,然后可以使用FK符号按如下方式删除外键:

alter table course drop foreign key course_ibfk_1;

7
这个回答比我在SO上找到的过去几个回答都需要更多赞。我无法相信语法是使用“通用”的约束名而不是实际的外键列名。这非常妨碍。 - OzzyTheGiant
@OzzyTheGiant:Marco Roy在以下链接中的回答解释了如何避免这种“通用”约束:https://dba.stackexchange.com/questions/15530/what-does-ibfk-stand-for-in-mysql - Arya

6
您需要删除"外键约束"和"键"。
Alter Table <table name> drop foreign key <constraint_name> 
Alter table <table name> drop key <column name>

谢谢 - 这让我困惑了一段时间。我添加了一个外键,所以我认为我可以直接删除它。我遇到了关于随机问题的错误,但我无法弄清楚为什么在我发出 DROP FOREIGN KEY 后索引仍然存在。我需要发出 drop key - Kingsley

3
如果您仍无法删除表格,请尝试以下内容。通过运行此操作,您可以查看所有详细信息。
SELECT
    TABLE_NAME,
    COLUMN_NAME,
    CONSTRAINT_NAME,
    REFERENCED_TABLE_NAME,
    REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'ReferenceTableName'; <-- change only this

如果您只想查看限制条件:
SELECT
    CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'ReferenceTableName';

我也删除了索引,然后约束键可以被删除。 - Thanasis
修改数据表 category,删除索引 primaryID - Thanasis

2
要删除外键约束,请按以下步骤操作:

MySQL:

ALTER TABLE Orders DROP FOREIGN KEY {Constraint/Key_name};

针对SQL Server / Oracle / MS Access:

ALTER TABLE Orders DROP CONSTRAINT {Constraint/Key_name};

0

你无法删除InstructorID的原因是你需要使用外键约束的名称。KevDev指定你必须运行'SHOW CREATE TABLE course'来查找约束名。在这样做之后,你可以删除外键。但是等等,'key'仍然留在那里,必须被删除。你可以运行'SHOW CREATE TABLE' course来检查该键是否仍然存在。一旦确认它仍然存在,就执行Bobby建议的操作。'Alter table drop key',这样你就完全删除了外键。


你不能删除InstructorID的原因是因为你需要使用外键约束的名称。KevDev指定你必须运行'SHOW CREATE TABLE course'来查找约束名。在这样做之后,你可以删除外键。但是等等, 'key'仍然留在那里,必须将其删除。你可以运行'SHOW CREATE TABLE course'来检查是否还有key。一旦确认它仍然存在,就执行Bobby建议的'Alter table drop key'。这样做即可完全删除外键。 - JessicaRam
好的,这看起来更像是一个答案,尽管我想知道这是否增加了任何有趣的东西,这些答案已经被kevdev和Bobby提到了。 - g00glen00b

0

无法删除 'string';请检查列/键是否存在:在 ruby on rails 中从数据库中删除列时,在终端中显示 ALTER TABLE accreditor_architectures DROP string 错误。


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