错误1215:为什么会发生?

时间:2015-03-16 22:59:13

标签: mysql

我很困惑为什么错误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)
);

2 个答案:

答案 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。


你在表名中混合了单数和复数。惯例是使用表所持有的对象的单数作为表名;但至少你应该尝试与你的命名方案保持一致。