首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修正在MySQL表中删除外键时的错误?

问如何修正在MySQL表中删除外键时的错误?
EN

Stack Overflow用户
提问于 2019-01-30 21:43:05
回答 1查看 591关注 0票数 3

因此,我成功地在没有AUTO_INCREMENT的情况下设置了所有的主键,如果它也是外键,则无法更改主键。因此,我试图删除外键(然后重新添加它们之后)。然而,它似乎认不出外键。

代码语言:javascript
复制
mysql> ALTER TABLE Teacher
    -> DROP FOREIGN KEY Credentials_ID;
ERROR 1091 (42000): Can't DROP 'credentials_ID'; check that column/key  exists

mysql> DESCRIBE TEACHER;
+----------------+-------------+------+-----+---------+----------------+  
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| Teacher_ID     | int(11)     | NO   | PRI | NULL    | auto_increment |
| Class_ID       | int(11)     | NO   | MUL | NULL    |                |
| Credentials_ID | int(11)     | NO   | MUL | NULL    |                |
| Teacher_Name   | varchar(20) | YES  |     | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+

如您所见,列/字段Credentials_ID存在于表中。

用于使表教师:

代码语言:javascript
复制
 mysql> CREATE TABLE Teacher(
     -> Teacher_ID int NOT NULL,
     -> Class_ID int NOT NULL,
     -> Credentials_ID int NOT NULL,
     -> Teacher_Name varchar(20),
     -> PRIMARY KEY (Teacher_ID),
     -> FOREIGN KEY (Class_ID) REFERENCES Class(Class_ID),
     -> FOREIGN KEY (Credentials_ID) REFERENCES Credentials(Credentials_ID)
     -> );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-30 21:50:15

DROP FOREIGN KEY的参数是外键的名称,而不是键中列的名称。当您创建表时,您没有给FK指定名称,因此MySQL自动分配了一个名称;这个默认名称是通过连接引用表、引用表、引用列名和_fk派生的。如果要查看指定的名称,请使用

代码语言:javascript
复制
mysql> SHOW CREATE TABLE Teacher;

其结果应包括:

代码语言:javascript
复制
CONSTRAINT `Teacher_Credentials_Credentials_ID_fk` FOREIGN KEY (`Credentials_ID`) REFERENCES `Credentials` (`Credentials_ID`)

要删除FK,您需要给出这个全名:

代码语言:javascript
复制
mysql> ALTER TABLE Teacher DROP FOREIGN KEY Teacher_Credentials_Credentials_ID_fk;

在创建表时,可以为键分配一个较短的名称,以避免这些冗长的名称。

代码语言:javascript
复制
 mysql> CREATE TABLE Teacher(
     -> Teacher_ID int NOT NULL,
     -> Class_ID int NOT NULL,
     -> Credentials_ID int NOT NULL,
     -> Teacher_Name varchar(20),
     -> PRIMARY KEY (Teacher_ID),
     -> FOREIGN KEY class_ID_fk (Class_ID) REFERENCES Class(Class_ID),
     -> FOREIGN KEY cred_ID_fk (Credentials_ID) REFERENCES Credentials(Credentials_ID)
     -> );

但是,请注意,外键名称在整个数据库中必须是唯一的,因此不能有两个表具有Credentials(Credentials_ID)的外键,并且对它们都使用相同的名称cred_ID_fk。这就是为什么默认名称中包含表名的原因,它确保了这些名称之间永远不会发生冲突。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54449998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档