我很困惑为什么错误1215:无法在我的代码中添加外键约束。有没有人有任何想法?
前四个表创建自己很好,但是当我尝试创建Stars表时会抛出错误。我不确定出了什么问题,因为被引用的键是主键,因此它们必须是唯一的且非空的。另外,这些密钥存在,因为先前已创建了先前的表。这可能只是我犯的一个愚蠢的错误,但最好是让新眼睛看一眼,对吧?
这个数据库很简单,因为我正在为学校作业做这件事。
create table MovieExec
(
execName varchar(40),
certNum numeric(30, 0),
address varchar(50),
networth real,
primary key(execName),
unique key(certNum)
);
create table Stud
(
studName varchar(30),
address varchar(50),
presCNum numeric(30, 0),
primary key(studName),
foreign key (presCNum) references MovieExec(certNum)
);
create table MovieStar(
starName varchar(30),
address varchar(50),
gender varchar(1),
birthdate date,
primary key(starName)
);
create table Movies
(
movieTitle varchar(30),
movieYear numeric(4,0),
length numeric(3,0),
genre varchar(30),
studioName varchar(30),
producerCNum numeric(30, 0),
primary key (movieTitle, movieYear),
foreign key (producerCNum) references MovieExec(certNum),
foreign key (studioName) references Stud(studName)
);
create table Stars
(
movieTitle varchar(30),
movieYear numeric(4,0),
starName varchar(30),
primary key (movieTitle, movieYear, starName),
foreign key (movieTitle) references Movies(movieTitle),
foreign key (movieYear) references Movies(movieYear),
foreign key (starName) references MovieStar(starName)
);
答案 0 :(得分:1)
它应该是标题和年份的复合外键:
foreign key (movieTitle, movieYear) references Movies(movieTitle, movieYear),
foreign key (starName) references MovieStar(starName)
它应该是复合的,因为这是Movies
表的确切PK,而且这是目前唯一可用的UNIQUE
组合。
然后正如@CBroe在回答中提到的那样,将Stars.starName
列编入索引是个好主意。
答案 1 :(得分:0)
http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html:
“[...]在引用的表中,必须有一个索引,其中引用的列以相同的顺序列为第一列”
在您的Movies
表中,您只有一个主键(movieTitle, movieYear)
- 但movieYear
不是该键中的第一列,因此
foreign key (movieYear) references Movies(movieYear)
<{1}}表的CREATE语句中的失败。
在stars
上添加密钥 - 然后创建引用Movies.movieYear
表上该列的外键将起作用。
仅供参考:MySQL有YEAR
数据类型 - 你应该使用它,而不是你电影年的NUMERIC。
你在表名中混合了单数和复数。惯例是使用表所持有的对象的单数作为表名;但至少你应该尝试与你的命名方案保持一致。