2013-05-30 61 views
0

我想爲1個表添加3個外鍵,但是InnoDB會給出一個錯誤。我可以自己添加第一個外鍵,但是其他兩個鍵發生同樣的錯誤。下面是語法:3個外鍵到1個表

CREATE TABLE Lokalen(
Gebouw VARCHAR(20) not null, 
Verdieping INT not null, 
Lokaal VARCHAR (3) not null, 
Beweging BOOLEAN, 
Computer BOOLEAN, 
primary key (Gebouw, Verdieping, Lokaal)); 

CREATE TABLE Reserveringen(
Gebouw VARCHAR(20) not null, 
Verdieping INT not null, 
Lokaal VARCHAR (3) not null, 
Begintijd TIME not null, 
Eindtijd TIME, 
Datum DATE not null, 
Reserveringsnummer int not null, 
primary key (Reserveringsnummer), 
foreign key (Gebouw) REFERENCES Lokalen(Gebouw), 
foreign key (Verdieping) REFERENCES Lokalen(Verdieping), 
foreign key (Lokaal) REFERENCES Lokalen(Lokaal)); 

希望你能幫助:)

+0

請提供實際的錯誤.. – Nanne

+0

#1005 - 無法創建表 '*** Reserveringen。'(錯誤:150)(詳細資料...) – user1301563

+0

細節說的是什麼? – Nanne

回答

1

複合外鍵的語法是

FOREIGN KEY (Gebouw, Verdieping, Lokaal) 
    REFERENCES Lokalen(Gebouw, Verdieping, Lokaal) 

我會強烈建議使用一個簡單的代理鍵(如自動增量id),作爲Localen中的PK和Reserveringen中的FK)。

爲了避免錯誤:

DROP TABLE IF EXISTS Lokalen; 
DROP TABLE IF EXISTS Reserveringen; 

CREATE TABLE Lokalen(
Gebouw VARCHAR(20) not null, 
Verdieping INT not null, 
Lokaal VARCHAR (3) not null, 
Beweging BOOLEAN, 
Computer BOOLEAN, 
primary key (Gebouw, Verdieping, Lokaal)); 

CREATE TABLE Reserveringen(
Gebouw VARCHAR(20) not null, 
Verdieping INT not null, 
Lokaal VARCHAR (3) not null, 
Begintijd TIME not null, 
Eindtijd TIME, 
Datum DATE not null, 
Reserveringsnummer int not null, 
primary key (Reserveringsnummer), 
FOREIGN KEY (Gebouw, Verdieping, Lokaal) 
    REFERENCES Lokalen(Gebouw, Verdieping, Lokaal)); 

與代理鍵

DROP TABLE IF EXISTS Lokalen; 
DROP TABLE IF EXISTS Reserveringen; 

CREATE TABLE Lokalen(
Id Int Not null auto_increment PRIMARY KEY, 
Gebouw VARCHAR(20) not null, 
Verdieping INT not null, 
Lokaal VARCHAR (3) not null, 
Beweging BOOLEAN, 
Computer BOOLEAN); 

CREATE TABLE Reserveringen(
Id Int not null auto_increment PRIMARY KEY, 
LokalenId Int not null, 
Begintijd TIME not null, 
Eindtijd TIME, 
Datum DATE not null, 
Reserveringsnummer int not null, 

FOREIGN KEY (LokalenId) 
    REFERENCES Lokalen(Id)); 
+0

我也試過了,得到了同樣的錯誤:( – user1301563

+0

@ user1301563不要忘記首先放置表Reserveringen,如果你重新創建... –

+0

我明白了現在,只需要添加ID的實際工作:p – user1301563

0

除了正在複製各種數據的方式(你應該正常化數據庫中讀出了(或「normaalvorm 「:))...

您需要對要用作外鍵的行的索引。見http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html

InnoDB的允許外鍵引用 列的任何索引列或組。但是,在參考表中,必須有一個索引 ,其中被引用的列被列爲 相同順序中的第一列。

+0

嗯,PK是不夠的? –

+0

如果外鍵使用它,在初始代碼中有一個複合鍵,但是分開的外鍵。鍵(你會說,'lokaal'),你不會有索引。所以是的,如果在外鍵中實際使用了PK就足夠了。 – Nanne

0

您可以添加此之外創建表:

Create Table Reserveringen(
..... 
..... 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;