</p>
& i# V4 O& R1 q% S8 V$ }( J3 G insert into dept values(1,’发卖部’); 0 b; \+ x0 q# g- y
insert into dept values(2,’财政部’); 0 u1 A P& w7 ]% n' T7 n5 u
insert into emp values (2,’Mary’,'Song’,1); ! e5 [) j8 ` J
insert into emp values (3,’Linda’,'Liu’,2); 6 o; l$ l4 n1 H1 F7 z1 @
insert into emp values (4,’Linlin’,'Zhang’,1);
6 U8 ^7 h: V' Y! f* `2 z 然后此刻我要删除发卖部,会有什么后不美观呢?
0 ]" R% W; u: n0 K# G2 K2 G/ n+ _
; K; n' }( P& L* }" ] delete from dept where deptno = 1;# [# n. M, v, s, F
我们发现除了dept中的一条数据被删除了,emp中两条数据也被删除了,其中emp中的两条数据是参照了发卖部的这条数据的,这就很轻易理解on delete cascade了。
0 M8 e; w3 K/ w 接下来我们再来看on delete set null,顾名思义了,这种体例成立的外键约束,当被参照的数据被删除是,参照该数据的那些数据的对应值将会变为空值,下面我们仍是经由过程试验来证实on delete set null浸染:1 @: w7 T4 o# t( y4 ?. w, C
首先恢复适才的那几条数据,然后更改约束:
$ {" i" G9 v# J5 v4 N- h. w& k/ J7 W2 }. x& R- f% }* q" }- e! k! }
alter table emp 7 X9 u) g' A6 K" }; Y
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null;
# Q" D2 c. k3 d. x" @! n 然后我们在执行删除操作:
7 s1 R0 J5 {- n' `6 F; j; x0 }0 G
# v0 s D* ~# y4 H! B delete from dept where deptno = 1;
! z. K( a: a" }& y% n( S 你也会发现除了dept中的发卖部被删除以外,emp中参照这条数据的两条数据的dept的值被自动赋空了,这就是on delete set null的浸染了。
4 u7 _: v8 z4 l. P 使用on delete set null有一点需要注重的是,被参参照其他表的那一列必需能够被赋空,不能有not null约束,对于膳缦沔的例子来说是emp中dept列必然不能有not null约束,如不美观已经界说了not null约束,又使用了on delete set null来删除被参照的数据时,将会发生:ORA-01407: 无法更新 (”DD”.”EMP”.”DEPT”) 为 NULL的错误。
* N5 p) v1 z, {- Y6 b- ~2 k 总的来讲on delete cascade和on delete set null的浸染是用来措置级联删除问题的,如不美观你需要删除的数据被其他数据所参照,那么你应该抉择到底但愿oracle怎么措置那些参照这些即将要删除数据的数据的,你可以有三种体例:' x* f2 d% o; r
禁止删除。这也是Oracle默认的 u4 Z- X( D ?7 S; [4 @- N
将那些参照本值的数据的对应列赋空,这个需要使用on delete set null关头字* P! @6 t2 z, N" z p8 J
将那些参照本值的数据一并删除,这个需要使用on delete cascade关头字 |