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)
);
我搜索了太多,但找不到任何解决方案或出现此错误的原因。
首先我有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));
"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)
);