外键约束:foreign key 简称: FK
外键在同一张表中可以有多个外键存在,而主键PK只能有一个
举个例子来说明外键约束,创建学生表和班级表,通过学生的编号来查询他所在的班级。
drop table if exists t_student;
create table t_student(
sno int(4) primary key auto_increment,
sname varchar(32),
classno int(4),
constraint t_student_classno_fk foreign key(classno) references t_class(cno)
);
drop table if exists t_class;
create table class(
cno int(4) primary key,
cname varchar(32)
);
insert into t_class(cno,cname) values(100,'高三1班');
insert into t_class(cno,cname) values(200,'高三2班');
insert into t_class(cno,cname) values(300,'高三3班');
insert into t_student(sname,classno) values('张三',100);
insert into t_student(sname,classno) values('李四',100);
insert into t_student(sname,classno) values('王五',400);
给学生字段添加了外键约束以后,约束了classno字段让它引用父表中的字段cno,这样400就添加不进去就会报错,保证了一个学生肯定有一个班级与之对应.
添加外键约束应注意一下三点:
-
外键字段可以为NULL,外键为空的数据也叫孤儿数据;
-
被引用字段必须具有unique约束;(其实就是主键)
-
创建表时先创建父表,再创建子表,插入数据时,先插入父表数据,再插入子表数据;
select
s.sname,c.cname
from
t_student s
join
t_class c
on
s.classno=c.cno;用这个sql语句去查询学生所对应的班级。
-
级联更新与级联删除:
-
用法:在添加级联更新与级联删除的时候,需要在外键约束后面添加关键字;
-
注意:级联更新与级联删除操作谨慎使用,因为级联操作会将数据改变或者删除【数据无价】
级联删除定义:在删除父表数据的时候,级联删除子表中数据.(on delete cascade)
添加级联删除:引用上面的例子,先删除外键约束再添加.
alter table t_student drop foreign key t_student_classno_fk;
alter table t_student add constraint t_student_classno_fk foreign key(classno) references t_class(cno) on delete cascade;
添加级联更新: 与级联删除类似,同样是把外键约束删除掉再添加.
alter table t_student drop foreign key t_student_classno_fk;
alter table t_student add constraint t_student_classno_fk foreign key(classno) references t_class(cno) on update cascade; 就是delete关键字换成了update,仅此而已.