学习目标:
1、掌握外键约束的意义
2、掌握建立外键约束的语法
学习过程:
一、外键约束
Foreign key 约束用于定义主从表之间的关系,外部键约束要定义在从表上, 但主表必须具有主键约束或唯一约束. 当定义了外部键约束之后,要求外部键列的数据必须在主表的主键列(或唯一键)中存在, 或者为Null。
在数据库中表与表之间不是独立的,它们是有关系的。这在我们显示生活中的例子也有很多,学生表和班级表之间的关系是,每一个学生必然属于一个班级,也就是说必须先有班级,然后才能添加学生。还比如部门表和职位表,每一个职位也必然属于某个部门等等。
下面我们建立一个部门表和一个职位表,因为职位表的数据必须参考部门表,所以我们把职位表称为从表,部门表称为主表。示例:
1、定义部门表和职位表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
--部门表 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:鉴别在父表中的表和列
1 2 3 |
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、先为部门表添加三条数据
1 2 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、尝试为职位表添加数据,这时候职位表的外键值必须是部门表已经存在的。
1 2 3 4 5 6 7 |
--添加成功 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:将依靠的外键值转换为空值
示例:
1 2 3 4 5 |
--先删除原来的约束 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值。