MySQL 错误 #1215 - 无法添加外键约束(无法创建关系 table)

MySQL ERROR #1215 - cannot add foreign key constraint (relationship table cannot be created)

我搜索了太多,但找不到任何解决方案或出现此错误的原因。

首先我有3个table。我有一个学生 table 有 1 个主键(昵称)和他们的密码。我创建那个没有任何问题。

其次,我有课程table,它有两个主键,分别是主题和课程。

我想创建 enrolledtable 因为我想保留哪个学生选修哪个课程。所以,我想用 3 个主键创建关系 table。其中 1 个是学生的昵称,另外 2 个是课程和科目。我收到类似“#1215 无法添加外键约束”的错误消息。

我先用了mysqlworkbench6.3。我尝试用 WAMP 解决这个问题,但我不能搜索太多,但找不到任何解决方案。

学生Table

课程Table

错误 - 已注册 Table

在mysql workbench昵称和主题都不会报错,但是课程不能是主键。我不能 select.

enter image description here

enter image description here

SQL 代码

CREATE TABLE studenttable(
nickname VARCHAR(45),
pass VARCHAR(45),
PRIMARY KEY (nickname)
);

CREATE TABLE coursetable(
subject VARCHAR(45),
course VARCHAR(45),
cname VARCHAR(45),
credit INT,
PRIMARY KEY (subject, course)
);

CREATE TABLE enrolledtable (
nickname VARCHAR(45),
subject VARCHAR(45),
course VARCHAR(45),
PRIMARY KEY (nickname, subject, course),
FOREIGN KEY (nickname) REFERENCES studenttable (nickname),
FOREIGN KEY (subject) REFERENCES coursetable (subject),
FOREIGN KEY (course) REFERENCES coursetable (course));
enrolledtable 中的

"course" 与其引用的字段的数据类型不同。 您的外键是一个 INT(11),但它引用了一个 VARCHAR(45)。

Mysql对外键的要求非常明确,其中MySQL需要外键和引用键的索引,这样外键检查可以快速而且不需要table 扫描。在引用table中,必须有一个索引,其中外键列列为相同顺序的第一列是相关的。 所以这没关系

drop table if exists enrolledtable;
drop table if exists coursetable;
drop table if exists studenttable;

CREATE TABLE studenttable(
nickname VARCHAR(45),
pass VARCHAR(45),
PRIMARY KEY (nickname)
);

CREATE TABLE coursetable(
subject VARCHAR(45),
course VARCHAR(45),
cname VARCHAR(45),
credit INT,
PRIMARY KEY (subject, course),
key k1 (course)                     #added
);

CREATE TABLE enrolledtable (
nickname VARCHAR(45),
subject VARCHAR(45),
course VARCHAR(45),
PRIMARY KEY (nickname, subject, course),
FOREIGN KEY (nickname) REFERENCES studenttable (nickname),
FOREIGN KEY (subject) REFERENCES coursetable (subject),
FOREIGN KEY (course) REFERENCES coursetable (course)
);

等等(尽管在您的数据库上下文中可能没有意义)

drop table if exists enrolledtable;
drop table if exists coursetable;
drop table if exists studenttable;

CREATE TABLE studenttable(
nickname VARCHAR(45),
pass VARCHAR(45),
PRIMARY KEY (nickname)
);

CREATE TABLE coursetable(
subject VARCHAR(45),
course VARCHAR(45),
cname VARCHAR(45),
credit INT,
PRIMARY KEY (subject, course),
key k1 (course,cname,credit)                        #added
);

CREATE TABLE enrolledtable (
nickname VARCHAR(45),
subject VARCHAR(45),
course VARCHAR(45),
PRIMARY KEY (nickname, subject, course),
FOREIGN KEY (nickname) REFERENCES studenttable (nickname),
FOREIGN KEY (subject) REFERENCES coursetable (subject),
FOREIGN KEY (course) REFERENCES coursetable (course)
);