Mysql无法添加外键

时间:2015-11-05 01:41:33

标签: 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可以解决这个问题,但还有其他方法吗?)

谢谢

2 个答案:

答案 0 :(得分: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)

引用UNIT表中的双列键

您还需要使用InnoDB来实际创建外键索引,所以:

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

答案 1 :(得分:0)

根据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)

现在我可以正确创建表格了。自昨天以来,我一直在努力解决这个问题。