数据库中删除主键的值外键的三种处理方式(1.restrict,2.cascade 3.set null)
外键所指定的字段(列)取值受限制,可以取两种值:
-
所参照主键中出现过的值;
-
可以取空值。
第一种情况 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;