【外键】当某字段为外键,插入值时,应保证该键在主表中已存在!
先上结论
当一个表中的一个字段,以另一张表的以字段为外键,插入数据时相对应的数值必须存在。
A表中zt_id字段,在B表中将A表的zt_id设置为外键,那么再向B表插入数据的时候,必须要保证A表中的zt_id已经存在!
比如A表中:
zt_id | zt_url |
---|---|
1 | xxxx |
在向B表中插入数据:
b_id | zt_id(A表的外键) |
---|---|
1 | 3 |
2 | 2 |
这时向B表中插入数据:
insert into B (zt_id) values (10);
那么一定会报错:
1452-Cannot add or update a child row: a foreign key constraint fails(......)
就是因为插入的zt_id=10在A表中并不存在!所以才会报错,
insert into B (zt_id) values (1);
如上就会正常,因为zt_id=1在A表中是存在的!
如何设置外键
以我最近在做的一个项目为例:
主表,主要存储专题的title等属性:
create table images_zt_list
(
zt_id int unsigned not null auto_increment,
is_overt boolean not null,
title varchar(255) not null,
description varchar(255) not null,
keywords varchar(255) not null,
effect char(30) not null default 'slide',
imgs text not null,
created_at datetime not null,
updated_at datetime not null,
primary key(zt_id)
)ENGINE = InnoDB;
其中zt_id就是主键。接下来在另一张表中,将zt_id设置为外键:
create table images_zt_resource
(
img_id int unsigned not null auto_increment,
zt_id int unsigned not null,
img_url text not null,
created_at datetime not null,
updated_at datetime not null,
primary key(img_id),
index (img_url),
foreign key(zt_id) references images_zt_list(zt_id)
)ENGINE = InnoDB;
在images_zt_resource资源表中,主要是存储与list表对应的图片。其中将图片url添加一个索引,并且将zt_id设置为外键。
注意:在resource表中。zt_id的数据类型必须与主表一致!否则在插入的时候也会报错!