我有一个研究案例,其中必须创建三个表。创建语句如下。
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可以解决这个问题,但还有其他方法吗?)
谢谢
答案 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)
现在我可以正确创建表格了。自昨天以来,我一直在努力解决这个问题。