2015-11-05 94 views
0

我有一個需要創建三個表的研究案例。有創造性的陳述如下。Mysql無法添加外鍵

create table COMMUNITY(
c_id varchar(10) primary key, 
name varchar(30) not null, 
longitude float, 
latitude float, 
post_code varchar(15) not null, 
key(c_id)) 

create table UNIT(
c_id varchar(10) not null, 
u_id int not null, 
name varchar(20) not null, 
key(c_id, u_id), 
primary key(c_id, u_id), 
constraint unique(c_id, u_id), 
constraint FK_UNIT foreign key(c_id) references COMMUNITY(c_id) 
on delete cascade on update cascade) 



create table ROOM(
r_id int not null, 
u_id int not null, 
c_id varchar(10) not null, 
name varchar(20), 
primary key(c_id, u_id, r_id), 
constraint FK_ROOM_UID foreign key(u_id) references UNIT(u_id)  
on delete cascade on update cascade, 
constraint FK_ROOM_CID foreign key(c_id) references UNIT(c_id) 
on delete cascade on update cascade) 

社區和單元表創建成功,但是當我嘗試創建房間,MySQL的給我Error Code: 1215. Cannot add foreign key constraint 我不知道發生了什麼事情在這裏和我怎樣才能創建它們? (我知道的InnoDB可以解決這個問題,但是否有其他方法可以讓我做到這一點?)

感謝

回答

1

這看起來像你看到實際的錯誤的罪魁禍首:

constraint FK_ROOM_UID foreign key(u_id) references UNIT(u_id) 
constraint FK_ROOM_UID foreign key(c_id) references UNIT(c_id) 

它應該是:

constraint FK_ROOM_UID foreign key(c_id, u_id) references UNIT(c_id, u_id) 

引用的單元表雙列鍵

您還需要使用InnoDB實際創建外鍵索引,所以:

CREATE TABLE UNIT(
    .... 
) ENGINE=InnoDB; 
+0

對不起,這是一個輸入錯誤,我糾正了這個錯誤。謝謝 – Korben

+0

PS - 您不需要c_id,u_id中的唯一索引 - 根據定義,PK是唯一的 –

0

我終於fugured了這一點,根據MySQL日誌

「找不到引用表中的索引其中 引用的列顯示爲表中的第一列或列類型 ,並且引用的表與約束不匹配。「

我所要做的就是在表的第一列創建主鍵並確保類型匹配。所以我改變了我的陳述如下

create table UNIT(
primary key(c_id, u_id), 
c_id varchar(10) not null, 
u_id int not null, 
name varchar(20) not null, 
constraint unique(c_id, u_id), 
constraint FK_UNIT foreign key(c_id) references COMMUNITY(c_id) 
on delete cascade on update cascade) 



create table ROOM(
primary key(c_id, u_id, r_id), 
r_id int not null, 
u_id int not null, 
c_id varchar(10) not null, 
name varchar(20), 
constraint FK_ROOM_UID foreign key(c_id, u_id) 
references UNIT(c_id, u_id) on delete cascade on update cascade) 

現在我可以正確創建表。自昨天以來,我一直在努力解決這個問題。