2013-05-30 37 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;