</p>' H2 A1 b5 K9 X! l7 O+ n2 H# m
insert into dept values(1,’发卖部’);
* S% E" u7 C4 i5 o insert into dept values(2,’财政部’); + O& ]7 _& W+ D+ }* X# b9 r
insert into emp values (2,’Mary’,'Song’,1); + N* M( O: ?0 p9 q( i8 j) ^- f
insert into emp values (3,’Linda’,'Liu’,2); 0 x0 b! H- ~3 E. H8 x% U
insert into emp values (4,’Linlin’,'Zhang’,1);0 d" w' g$ i8 H! O. H) r
然后此刻我要删除发卖部,会有什么后不美观呢?
8 g- o3 L% s. z. x7 `; P1 B
) t/ o9 \+ P6 T- B ]. m delete from dept where deptno = 1;: x& ~" U+ d3 m- n, O- \& `
我们发现除了dept中的一条数据被删除了,emp中两条数据也被删除了,其中emp中的两条数据是参照了发卖部的这条数据的,这就很轻易理解on delete cascade了。
* m+ Z9 U9 D; G' t- z 接下来我们再来看on delete set null,顾名思义了,这种体例成立的外键约束,当被参照的数据被删除是,参照该数据的那些数据的对应值将会变为空值,下面我们仍是经由过程试验来证实on delete set null浸染:
- t' f2 y2 {* y7 R2 {2 \ 首先恢复适才的那几条数据,然后更改约束:
3 K/ n1 _0 R5 C- T( ~: z" @8 b" j( c6 }) v& z2 G `
alter table emp ! u4 W0 r; `% }' @6 p
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null;9 D' b5 v( N- o1 C
然后我们在执行删除操作:2 O4 \# _ T% P$ Y0 _
' t* T5 X2 E1 o3 M t* l# L delete from dept where deptno = 1;) t0 j$ z B' D% Z5 @
你也会发现除了dept中的发卖部被删除以外,emp中参照这条数据的两条数据的dept的值被自动赋空了,这就是on delete set null的浸染了。% L- C/ x; v' I. o& i0 Q# q
使用on delete set null有一点需要注重的是,被参参照其他表的那一列必需能够被赋空,不能有not null约束,对于膳缦沔的例子来说是emp中dept列必然不能有not null约束,如不美观已经界说了not null约束,又使用了on delete set null来删除被参照的数据时,将会发生:ORA-01407: 无法更新 (”DD”.”EMP”.”DEPT”) 为 NULL的错误。
2 L0 j9 Z2 K) z) t4 e4 k) T 总的来讲on delete cascade和on delete set null的浸染是用来措置级联删除问题的,如不美观你需要删除的数据被其他数据所参照,那么你应该抉择到底但愿oracle怎么措置那些参照这些即将要删除数据的数据的,你可以有三种体例:
" U0 T- ?4 u" u/ ?/ s 禁止删除。这也是Oracle默认的
; E, r; O: d# G" c- E 将那些参照本值的数据的对应列赋空,这个需要使用on delete set null关头字
; n1 t9 p! |- t 将那些参照本值的数据一并删除,这个需要使用on delete cascade关头字 |