繁体   English   中英

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

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

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

首先我有3张桌子。 我有一个studenttable,其中有1个主键(昵称)及其密码。 我创建了那个没有任何问题。

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

我想创建可注册课程,因为我想保留哪些课程。 因此,我想用3个主键创建关系表。 其中1个是学生的昵称,另2个是课程和主题。 我收到类似“#1215无法添加外键约束”的错误消息。

我首先使用mysql workbench 6.3。 我尝试使用WAMP解决该问题,但是我搜索不了太多,但是找不到任何解决方案。

学生桌

在此处输入图片说明

课程表

在此处输入图片说明

错误-登记表

在此处输入图片说明

在mysql工作台中,昵称和主题没有给出错误,但是当然不能是主键。 我无法选择。

在此处输入图片说明

在此处输入图片说明

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需要在外键和引用键上建立索引,以便外键检查可以快速进行,而无需进行表扫描。 在引用表中,必须有一个索引,其中外键列被列出,因为以相同顺序排列的第一列是相关的。 所以没关系

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)
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM