CREATE DATABASE my_db;
CREATE TABLE class (
classID int NOT NULL AUTO_INCREMENT,
nameClass varchar(255),
classLeader varchar(255),
FOREIGN KEY (classLeader) REFERENCES student(studentID),
PRIMARY KEY (classID));
CREATE TABLE student (
studentID int NOT NULL AUTO_INCREMENT,
lastName varchar(255),
firstName varchar(255),
classID int,
FOREIGN KEY (classID) REFERENCES class(classID),
PRIMARY KEY (studentID));
Run Code Online (Sandbox Code Playgroud)
我试图通过使用外键确保表之间的数据一致性,以便DBMS可以检查错误; 然而,似乎我们不能出于某种原因这样做.什么是错误,有替代方案吗?另外,当我填写一个有外键的表时,我无法填写为外键保留的字段,对吗?是否外键被认为是关键?
spe*_*593 53
最可能的问题是这一行:
FOREIGN KEY (classLeader) REFERENCES student(studentID),
Run Code Online (Sandbox Code Playgroud)
classLeader的数据类型是VARCHAR(255).这有匹配数据类型的引用的列... student.studentID.当然,student表必须存在,studentID列必须存在,studentID列应该是学生表的PRIMARY KEY(虽然我相信MySQL允许它是一个独特的键,而不是一个主键,甚至只需要一个索引.)
在任何情况下,这里缺少的是来自的输出 SHOW CREATE TABLE student;
数据类型不匹配.
该classLeader VARCHAR(255)列不能是外键引用studentID INT.
两列的数据类型必须匹配.
您收到此错误的原因是FOREIGN KEY (classLeader) REFERENCES student(studentID)
数据类型为studentID且classLeader不同.主键列和外键列的数据类型必须相同.
Corresponding columns in the foreign key and the referenced key must have similar data types.
The size and sign of integer types must be the same.
The length of string types need not be the same.
For nonbinary (character) string columns, the character set and collation must be the same.
Run Code Online (Sandbox Code Playgroud)
虽然这是一个很晚的答案,但我希望它对少数人有帮助。
我遇到了同样的问题。但是,这里的数据类型也相同。
但是,当我检查create table语句时,我发现一个表使用名为“ MyISAM”的引擎创建,而另一个表则使用“ InnoDB”。
SHOW CREATE TABLE <TABLE NAME>
Run Code Online (Sandbox Code Playgroud)
然后我将两个表引擎都更改为“ InnoDB”,并且它起作用了(我能够创建外键)