2013-03-26 2 views
1

Я работаю над назначением базы данных и столкнулся с этой ошибкой.Помощь MySQL FOREIGN KEY

База данных должна выглядеть ...

Legend: **Primary Key** *Foreign Key 

.

Movies (**title, year**, length, genre, *studioName, *producerID) 
StarsIn(***movieTitle, *movieYear, *starName**) 
MovieStar(**name**, birthdate, address, gender) 
MovieMaker(**ID**, name, address) 
Studio (**name**, address, *presidentID) 

И мой код выглядит следующим образом ...

CREATE TABLE Movies (
title varchar(50), 
year int, 
length int, 
genre varchar(50), 
studioName varchar(50), 
producerID varchar(50), 
PRIMARY KEY (title,year) 
FOREIGN KEY (studioName) REFERENCES Studio(name), 
FOREIGN KEY (producerID) REFERENCES MovieMaker(ID), 
); 

CREATE TABLE StarsIn (
movieTitle varchar(50), 
movieYear int, 
starName varchar(50), 
PRIMARY KEY (movieTitle,movieYear,starName), 
FOREIGN KEY (movieTitle) REFERENCES Movies(title), 
FOREIGN KEY (movieYear) REFERENCES Movies(year), 
FOREIGN KEY (starName) REFERENCES MovieStar(name) 
); 

CREATE TABLE MovieStar (
name varchar(50), 
birthdate int, 
address varchar(50), 
gender varchar(50), 
PRIMARY KEY (name) 
); 

CREATE TABLE MovieMaker (
ID varchar(50), 
name varchar(50), 
address varchar(50), 
PRIMARY KEY (ID) 
); 

CREATE TABLE Studio (
name varchar(50), 
address varchar(50), 
presidentID varchar(50), 
PRIMARY KEY (name), 
FOREIGN KEY (presidentID) REFERENCES MovieMaker(ID) 
); 

Однако, я получаю довольно много ошибок, заявляющих, что синтаксис для моих внешних ключей выключены. Любой шанс, что кто-то может протянуть руку помощи?

+1

И сообщения об ошибках ...? – zerkms

ответ

1

Таблицы, ссылающиеся на другие таблицы с помощью внешних ключей, могут быть определены только после уже существующие таблицы. Поэтому вы должны изменить порядок своих таблиц так, чтобы в первую очередь создавались те, которые ссылаются на ограничения FOREIGN KEY.

Кроме того, внешние ключи, ссылающихся Movies.year и Movies.title собираются потерпеть неудачу, потому что не имеют индексы, определенные на этих колонках индивидуально. У вас есть их как составной PRIMARY KEY, но им нужны собственные индексы.

/* MovieStar, MovieMaker are referenced by other tables 
    but have no FKs of their own, so create them first */ 
CREATE TABLE MovieStar (
    name varchar(50), 
    birthdate int, 
    address varchar(50), 
    gender varchar(50), 
    PRIMARY KEY (name) 
); 

CREATE TABLE MovieMaker (
    ID varchar(50), 
    name varchar(50), 
    address varchar(50), 
    PRIMARY KEY (ID) 
); 

/* Studio can be created next, referencing only MovieMaker */ 
CREATE TABLE Studio (
    name varchar(50), 
    address varchar(50), 
    presidentID varchar(50), 
    PRIMARY KEY (name), 
    FOREIGN KEY (presidentID) REFERENCES MovieMaker(ID) 
); 

/* Movies references 2 of the above */ 
CREATE TABLE Movies (
    title varchar(50), 
    year int, 
    length int, 
    genre varchar(50), 
    studioName varchar(50), 
    producerID varchar(50), 
    /* A comma was missing here... */ 
    PRIMARY KEY (title,year), 
    FOREIGN KEY (studioName) REFERENCES Studio(name), 
    FOREIGN KEY (producerID) REFERENCES MovieMaker(ID), 
    /* Add individual indices on Movies. Omitting this would result in errno 150 */ 
    INDEX (year), 
    INDEX (title) 
); 

CREATE TABLE StarsIn (
    movieTitle varchar(50), 
    movieYear int, 
    starName varchar(50), 
    PRIMARY KEY (movieTitle,movieYear,starName), 
    FOREIGN KEY (movieTitle) REFERENCES Movies(title), 
    FOREIGN KEY (movieYear) REFERENCES Movies(year), 
    FOREIGN KEY (starName) REFERENCES MovieStar(name) 
); 

Вот демо всего вещь здания должным образом: http://sqlfiddle.com/#!2/eaf70c

+0

Вы можете просто объявить 'FOREIGN KEY (movieTitle, movieYear) ССЫЛКИ Фильмы (название, год)', что, вероятно, более подходит для этого случая. –

+0

@ MichealBerkowski Это великолепно работает! Я никогда не знал, что порядок в том, что большая часть сделки в MySQL. Большое спасибо! – Jordotron