外键约束
外键 (FK) 是用于在两个表中的数据之间建立和加强链接的一列或多列的组合,可控制在外键表中存储的数据。 在外键引用中,当包含一个表的主键值的一个或多个列被另一个表中的一个或多个列引用时,就在这两个表之间创建了链接。 这个列就成为第二个表的外键。比如表A中的主键是表B中的字段,则该字段就是表B的外键,表A是主表,表B是从表。以MySQL为例,总结一下3种外键约束方式的区别和联系。
假设有学生表student(sid,sname,did)以及院系表depart(did,dname)。sid为student的主键,did为depart的主键且为student的外键。创建depart表的sql语句如下:
create table depart(
did int not null,
dname varchar(50),
primary key(did)
)
然后插入三条记录(1,“计算机学院”),(2,“经贸学院”)。
insert into depart(1,"计算机学院");
insert into depart(2,"经贸学院");
分别以不同的约束方式创建外键引用关系:
(1)NO ACTION:数据库引擎将引发错误,此时将回滚对主表中行的删除或更新操作。
create table student(
sid int not null,
sname varchar(30),
primary key(sid),
foreign key(did) references depart(did) on delete no action on update no action
)
插入3条记录(1,“张三”,1),(2,“李四”,2),(3,“王五”,3)。
insert into student(1,"张三",1);#插入成功
insert into student(2,"李四",2);#插入成功
insert into student(3,"王五",3);#无法插入,院系号3不存在,与参照完整性约束不符
delete from depart where did=1;#从表student中有相关引用,因此主表中无法删除
update depart set did=2 where did=1;#从表中有相关引用,因此主表中无法修改
(2)CASCADE:如果在主表中更新或删除了一行,则将在从表中更新或删除相应的行。
create table student(
sid int not null,
sname varchar(30),
primary key(sid),
foreign key(did) references depart(did) on delete cascade on update cascade
)
插入3条记录(1,“张三”,1),(2,“李四”,2),(3,“王五”,3)。
insert into student(1,"张三",1);#插入成功
insert into student(2,"李四",2);#插入成功
insert into student(3,"王五",3);#无法插入,院系号3不存在,与参照完整性约束不符
delete from depart where did=2;#student中第2条记录级联删除
update depart set did=2 where did=1;#student中第一条记录的did级联修改为2
(3)SET NULL:如果更新或删除了主表中的相应行,则会将构成外键的所有值设置为 NULL。
create table student(
sid int not null,
sname varchar(30),
primary key(sid),
foreign key(did) references depart(did) on delete set null on update set null
)
插入3条记录(1,“张三”,1),(2,“李四”,2),(3,“王五”,3)。
insert into student(1,"张三",1);#插入成功
insert into student(2,"李四",2);#插入成功
insert into student(3,"王五",3);#无法插入,院系号3不存在,与参照完整性约束不符
delete from depart where did=1;#student中第1条记录的did设置为NULL
update depart set did=1 where did=2;#student中第2条记录的did设置为NULL