a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 155|回复: 1

[考试辅导] Oracle技术:Oracle中非默认方式创建外键该如何使用

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
建树外键约束时如不美观使用Oracle默认的建树体例,在删除被参照的数据时,将无法被删除,这一点在Oracle9i中给了我们更多矫捷的选择,我们可是使用on delete cascade和 on delete set null关头字来抉择删除被参照数据时是否要将参照这个数据的那些数据一并删除,仍是将那些参照这条数据的数据的对应值赋空。   例如下面这两个表平分袂存的时员工的根基信息和公司的部门信息。我们为
5 `! f9 G6 |( ^' M" k& W
7 K  J1 \4 Q5 N2 p6 a! }1 O  create table dept
# i, {3 g% t/ y5 j/ L  (deptno number(10) not null,
3 J! m$ s" G2 _# {- n, j, }  deptname varchar2(30) not null,
) r* M0 S* A1 u/ v9 x" Q8 W5 d) Z3 A  constraint pk_dept primary key(deptno));/ F/ v. v( B, _7 z  y" Y
  和# i( V  [7 @4 S5 ~! @  Q
$ Y& \$ F- j; z: @7 y+ Z8 m+ b8 V
  create table emp
/ ]5 d9 R9 }& _! m/ c* R  ( empno number(10) not null,
. W: x7 Q' @" u5 p: G1 O  fname varchar2(20) ,
. J* A/ Y& M4 g5 Z  lname varchar2(20) , 3 ^# J/ H. J2 w( x
  dept number(10) , : {, g( Q  Q- v# d& n- G3 `4 Y
  constraint pk_emp primary key(empno));4 z; n4 t6 ^7 R( {+ ?
  然后我们此刻分袂使用这两个关头字来增添外键试一下,首先我们来试一下on delete cascade3 i0 S. X# O! [8 N

. j# e9 _& A" O8 Y% ^7 i- x$ q  alter table emp
( n" [  F9 ]5 m$ }# Y  add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete cascade;
2 ]) ^( l4 r; Y, }
# C6 i9 Z& p" Z; p6 F  先增添外键。然后插入数据。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:Oracle中非默认方式创建外键该如何使用

</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关头字
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-18 22:56 , Processed in 0.185698 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表