外键约束(了解)
外键约束不是必须的。
(一)概述
1、关键字:foreign key
2、特点:
(1)约束的是两张表的关系
需要两张表,或者一张表虚拟成两张表
(2)两张表分为主表(父表)和从表(子表)
外键的建立/指定是在从表(子表)上建立。
(3)被参考的表称为主表,主表的被参考列必须是主键或唯一键
(4)一个表可以有多个外键
(二)如何指定外键
1、在建表时指定外键
要求:
(1)建表的顺序
先建主表,再建从表
从表的语法:
create table 【数据库名.】表名称(
字段1 数据类型 primary key,
字段2 数据类型 【unique key】【not null】【default 默认值】,
字段3 数据类型 【unique key】【not null】【default 默认值】,
…,
foreign key(从表的外键列) references 主表名(主表被参考的列名)
);
(2)删表的顺序
先删从表,再删除主表
(3)添加/修改从表数据
添加/修改从表记录时,引用主表的列的值必须是存在的。
例如:添加/修改员工表时,员工所在部门的值必须引用部门表的部门编号,保证该部门编号是存在的。
(4)删除/修改主表记录
A:默认情况下,如果主表的被参考列的值被引用,那么就不能轻易的被删除和修改。
例如:2号部门被员工引用了,那么这个2号部门就不能被删除,并且2这个编号值不能被修改。
foreign key(从表的外键列) references 主表名(主表被参考的列名) 【on update restrict/no action】 【on delete restrict/no action】
B:如果在建立外键时,指定了“级联”策略,那么可以做到级联修改和删除
foreign key(从表的外键列) references 主表名(主表被参考的列名) 【on update cascade】 【on delete cascade】
C:如果在建立外键时,指定了“置空”策略,那么可以做到主表的记录被修改或删除时,从表的对应字段变为NULL
foreign key(从表的外键列) references 主表名(主表被参考的列名) 【on update set null】 【on delete set null】
#部门表:主表
create table dept(
did int primary key, #部门编号
dname varchar(20) not null unique key, #部门名称
description varchar(100) #部门简介
);
insert into dept values(1,‘财务部’,‘发钱的’),(2,‘后勤部’,‘发礼物的’);
#职位表:主表
create table job(
jid int primary key, #职位编号
title varchar(20) not null , #职位名称
description varchar(100) #职位简介
);
insert into job values(1,‘会计’,‘算钱的’),(2,‘助理’,‘修电脑的’);
#员工表:从表
create table emp(
eid int primary key, #员工编号
ename varchar(20) not null, #员工姓名
deptid int, #所在的部门编号 deptid可以取名did
jobid int, #职位编号
foreign key(deptid) references dept(did),
foreign key(jobid) references job(jid) on update set null on delete set null
);
insert into emp values(1,‘张三’,1,1),(2,‘李四’,1,1),(3,‘王五’,2,2),(4,‘赵六’,2,2);
2、建表后指定外键
alter table 从表名称 add foreign key(从表的字段) references 主表名(主表被参考的列名);