create table dept(
deptno number(10) not null,
deptname varchar2(30) not null,
constraint pk_dept primary key(deptno)
);
create table emp(
empno number(10) not null,
fname varchar2(20) ,
lname varchar2(20) ,
dept number(10) ,
constraint pk_emp primary key(empno)
);
--然后我们现在分别使用这两个关键字来增加外键试一下,首先我们来试一下on delete cascade
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete cascade; --级联删除
--或:(上下两种方式不可兼得)
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null; --主表删除数据,子表引用的地方赋值为NULL
/*
alter table emp
drop constraint fk_emp_dept; --删除外键
*/
--先增加外键。然后插入数据。
insert into dept values(1,'销售部');
insert into dept values(2,'财务部');
insert into emp values (2,'Mary','Song',1);
insert into emp values (3,'Linda','Liu',2);
insert into emp values (4,'Linlin','Zhang',1);
select * from dept;
select * from emp;
delete from dept where deptno = 1;
总结:如果设置的是级联删除:执行删除语句时,删除主表数据的同时,也删除了子表记录。
deptno number(10) not null,
deptname varchar2(30) not null,
constraint pk_dept primary key(deptno)
);
create table emp(
empno number(10) not null,
fname varchar2(20) ,
lname varchar2(20) ,
dept number(10) ,
constraint pk_emp primary key(empno)
);
--然后我们现在分别使用这两个关键字来增加外键试一下,首先我们来试一下on delete cascade
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete cascade; --级联删除
--或:(上下两种方式不可兼得)
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null; --主表删除数据,子表引用的地方赋值为NULL
/*
alter table emp
drop constraint fk_emp_dept; --删除外键
*/
--先增加外键。然后插入数据。
insert into dept values(1,'销售部');
insert into dept values(2,'财务部');
insert into emp values (2,'Mary','Song',1);
insert into emp values (3,'Linda','Liu',2);
insert into emp values (4,'Linlin','Zhang',1);
select * from dept;
select * from emp;
delete from dept where deptno = 1;
总结:如果设置的是级联删除:执行删除语句时,删除主表数据的同时,也删除了子表记录。
如果设置的是“主表删除数据,子表引用的地方赋值为NULL”,执行删除语句时,删除主表数据的同时,子表记录中相应的地方被更新为NULL了。
==============
技术延伸(级联更新):
在上面的级联中,我们提到用 on delete set null,如果我想进行级联更新,当emp表的外键字段为null时,我想把其它字段更新成另一个值,该如何操作呢?
在oralce中,是不支持级联更新的,所以我们就要到用触发器。
例如,当emp表中的外键为null时,我就把字段lname的值更新为'zzz':
触发器:
create or replace trigger tri_emp_update
before update on emp
for each row
begin
:new.lname := 'zzz';
end;
就这样,当我们在删除dept表中的数据时,emp表中的外键不仅更新为空了,而且还把lname中的值变更为zzz了。