学习目标:
1、掌握外键约束的意义
2、掌握建立外键约束的语法
学习过程:
一、外键约束
Foreign key 约束用于定义主从表之间的关系,外部键约束要定义在从表上, 但主表必须具有主键约束或唯一约束. 当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或唯一键)中存在, 或者为Null。
在数据库中表与表之间不是独立的,它们是有关系的。这在我们显示生活中的例子也有很多,学生表和班级表之间的关系是,每一个学生必然属于一个班级,也就是说必须先有班级,然后才能添加学生。还比如部门表和职位表,每一个职位也必然属于某个部门等等。
下面我们建立一个部门表和一个职位表,因为职位表的数据必须参考部门表,所以我们把职位表称为从表,部门表称为主表。示例:
1、定义部门表和职位表
--部门表
create table department
(
dep_id int primary key,
dep_name varchar2(100) not null
)
--职位表
create table post
(
post_id int primary key,
post_name varchar2(100),
--所属部门
dep_id int ,
)
2、定义外键约束,FOREIGN KEY:定义在表约束级的子表的列,REFERENCES:鉴别在父表中的表和列
alter table post drop constraint FK_dep_id
--外键约束 -- constraint 约束名 foreign key(外键) references 主表(主键)
alter table post add constraint FK_dep_id foreign key(dep_id) references department(dep_id)
3、先为部门表添加三条数据
insert into department(dep_id,dep_name) values(1,'IT部门');
insert into department(dep_id,dep_name) values(2,'行政部门');
insert into department(dep_id,dep_name) values(3,'扫地部门');
4、尝试为职位表添加数据,这时候职位表的外键值必须是部门表已经存在的。
--添加成功
insert into post(post_id,post_name,dep_id) values(1,'DBA',1)
insert into post(post_id,post_name,dep_id) values(2,'java程序员',3);
insert into post(post_id,post_name,dep_id) values(3,'项目经理',3);
--添加失败
insert into post(post_id,post_name,dep_id) values(3,'项目组长',4);
二、CASCADE级联特性
CASCADE是级联操作,一般只主表发生变化是,从表应该做如何变化。
ON DELETE CASCADE:当父表中的行被删除的时候,同时删除在子表中依靠的行。
nON DELETE SET NULL:将依靠的外键值转换为空值
示例:
--先删除原来的约束
alter table post drop constraint FK_dep_id
--重新定义外键约束
alter table post add constraint FK_dep_id foreign key(dep_id) references department(dep_id)
on delete set null
尝试把主表的主键为3的语句删除,这时候从表的外键为3的值就会修改为null值。