因此,我成功地在没有AUTO_INCREMENT的情况下设置了所有的主键,如果它也是外键,则无法更改主键。因此,我试图删除外键(然后重新添加它们之后)。然而,它似乎认不出外键。
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存在于表中。
用于使表教师:
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)
-> );发布于 2019-01-30 21:50:15
DROP FOREIGN KEY的参数是外键的名称,而不是键中列的名称。当您创建表时,您没有给FK指定名称,因此MySQL自动分配了一个名称;这个默认名称是通过连接引用表、引用表、引用列名和_fk派生的。如果要查看指定的名称,请使用
mysql> SHOW CREATE TABLE Teacher;其结果应包括:
CONSTRAINT `Teacher_Credentials_Credentials_ID_fk` FOREIGN KEY (`Credentials_ID`) REFERENCES `Credentials` (`Credentials_ID`)要删除FK,您需要给出这个全名:
mysql> ALTER TABLE Teacher DROP FOREIGN KEY Teacher_Credentials_Credentials_ID_fk;在创建表时,可以为键分配一个较短的名称,以避免这些冗长的名称。
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。这就是为什么默认名称中包含表名的原因,它确保了这些名称之间永远不会发生冲突。
https://stackoverflow.com/questions/54449998
复制相似问题