关于外键约束
外键约束
外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。
外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。举个例子:如果想要表示学生和班级的关系,首先要有学生表和班级表两张表,然后学生表中有个字段为stu_clazz(该字段表示学生所在的班级),而该字段的取值范围由班级表中的主键cla_no字段(该字段表示班级编号)的取值决定。那么班级表为主表,学生表为从表,且stu_clazz字段是学生表的外键。通过stu_clazz字段就建立了学生表和班级表的关系。
【示例5】表的外键约束
-- 创建一个班级表
create table class (
cno int(4) auto_increment, -- 只有主键才可以自增
cname varchar(12) not null,
room varchar(4),
primary key(cno)
);
-- insert into class values (null,'Java001',507);
-- insert into class values (null,'Java002',502);
-- insert into class values (null,'大数据001',401);
insert into class values (null,'Java001',507),(null,'Java002',502),(null,'大数据001',401);
-- 查询数据
select * from class
-- 创建一个学生表
create table student2(
sno int(6) primary key auto_increment,
name varchar(12),
sex char(1),
age int(2),
classno int(4),
constraint fk_stu2_classno foreign key (classno) references class(cno)
);
desc student2;
insert into student2 values(null,'zhangsan','男',23,1);
insert into student2 values(null,'lisi','男',24,1);
insert into student2 values(null,'wangwu','男',16,2);
insert into student2 values(null,'zhaoliu','男',24,4); --
delete from class where cno = 1
update class set cno = 5 where cno = 2
select * from class
select * from student2
-- 如果想删除1班,请手动的先对1班的学生进行处理(删除或者清空外键)
update student2 set classno = null where classno = 1
delete from class where cno = 1
-- 希望在更新班级编号的时候,可以直接更新学生的班级编号;希望在删除某个班级的时候,清空学生的班级编号
-- 修改外键设置:外键要修改只能先删除再添加
alter table student2 drop foreign key fk_stu2_classno; -- 注意提示的问题,其实已经删除了外键
alter table student2 add constraint fk_stu2_classno foreign key (classno) references class(cno) on delete set null on update cascade