外键所指定的字段(列)取值受限制,可以取两种值:
所参照主键中出现过的值;
可以取空值。
第一种情况 restrict关键字
例子:创建了2张表
create table class(cno int primary key,
cname varchar(20)
)
create table student(sno int primary key,
sname varchar(10),
cno int,
foreign key(cno) references class(cno) on delete restrict)
表class中,con列是主键,表student中,sno是主键,cno外键,外键取值如上面说过的右2种
情况1.要在主键中出现过2.该外键取值位null,上述表student外键加了restrict关键字所以当从表class(主键)删除一条数据,刚好表student中有该班级的学生,则会报错,不允许删除
第二种情况 cascade关键字
create table student(sno int primary key,
sname varchar(10),
cno int,
foreign key(cno) references class(cno) on delete cascade)
cascade表示联级删除,当删除主表(主键)即class表的中一条数据,会把表student(依赖表)
里对应的数据一起删掉
第三种情况 set null关键字
在外键定义时还可以指定on delete set null,表示删除class表中的一条数据时,如果student表中有对应的数据,则把这些对应的数据的cno设置为空值NULL。
--有关set null的测试
--1.创建2张表
create table class(
cno number(5) primary key,
cname varchar2(20)
);
create table student(
sno number(5) primary key,
sname varchar2(10),
cno number(5),
foreign key(cno) references class(cno) on delete set null
);
--第一张和第二张表插入数据
insert into class ele01 values(1,'高一一班');
insert into class ele01 values(2,'高二二班');
insert into class ele01 values(3,'高三三班');
commit;
insert into student values(1,'大黄01',01);
insert into student values(2,'大黄02',02);
insert into student values(3,'大黄03',03);
commit;
--删除数据
delete from class ele01 where ele01.cno= 2;
commit;
--查看结果
select * from student;