2015-03-16 8 views
2

Я смущен, почему ошибка 1215: не могу добавить ограничение внешнего ключа, которое происходит в моем коде. У кого-нибудь есть идеи?Ошибка 1215: Почему это происходит?

Первые четыре таблицы создают себя прекрасно, но ошибка возникает, когда я пытаюсь создать таблицу «Звезды». Я не уверен, что происходит не так, поскольку ссылки на них являются первичными ключами, поэтому они должны быть уникальными и не равными нулю. Кроме того, эти ключи существуют, поскольку предыдущие таблицы были созданы в первую очередь. Это может быть просто глупая ошибка, которую я сделал, но лучше иметь свежие глаза, глядя на нее, не так ли?

Эта база данных упрощена, потому что я делаю это для школьного задания.

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

ответ

1

Она должна быть составным внешним ключом для названия и года:

foreign key (movieTitle, movieYear) references Movies(movieTitle, movieYear), 
foreign key (starName) references MovieStar(starName) 

Это должно быть составным, потому что это точная PK из Movies таблицы, и это единственное UNIQUE сочетания там в настоящее время.

Затем, как @CBroe, упомянутые в их ответе, было бы неплохо проиндексировать столбец Stars.starName.

+0

спасибо. Ваш ответ помог мне решить мою проблему. – Coliwack

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) 

в вашем заявлении CREATE для таблицы stars не удается.

Добавить ключ на Movies.movieYear - тогда будет создан внешний ключ, ссылающийся на этот столбец таблицы stars.

FYI: MySQL имеет тип данных YEAR - вы должны использовать это вместо NUMERIC для своего кино года.


И вы смешиваете единственное и множественное число в именах ваших таблиц. Конвенция заключается в использовании единственного числа объекта, которое таблица имеет в качестве имени таблицы; но, по крайней мере, вы должны попробовать и быть в соответствии с вашей схемой именования.

Смежные вопросы