a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 183|回复: 1

[考试辅导] Oracle辅导:Oracle外键约束修改行为(三)

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。
" s# }" w' W5 g  这篇简单描述一下CASCADE操作。8 p* }7 Y; o" i$ x  B( I# F
  上一篇描述了Oracle外键处理操作:SET TO NULL,这里简单介绍一下CASCADE操作。还是利用前面例子的表,不过约束需要重建。
7 l+ ^. W0 }# k3 f  SQL> DROP TABLE T_C;
8 o( ^5 B; q# J/ w  表已删除。; s8 k# V! N9 g* a3 [3 \
  SQL> DROP TABLE T_P;  P% p: s' l6 Y* u1 i1 `6 x' v2 v& A
  表已删除。
5 I2 p* A  q* r2 V# a  SQL> CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));( n6 P7 Q: t; y, Y8 O
  表已创建。; E& b5 Y* Q4 M7 a0 `( S
  SQL> ALTER TABLE T_P ADD PRIMARY KEY (ID);
+ t  m; T) `4 ?' d5 d9 k/ n5 N  表已更改。
+ _9 J( U' G. \  SQL> CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));4 T; L( n2 l+ k$ s- n
  表已创建。
% K/ o/ ]7 D  b4 ^2 l7 |6 y  SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C: n8 K9 k( U  g) D
  2 FOREIGN KEY (FID)
6 W% B7 f. k0 ~+ D- \$ ~) i  c  3 REFERENCES T_P (ID)! ], p0 P9 a5 s
  4 ON DELETE CASCADE;, J, S6 o! b' c/ }; ~$ ^
  表已更改。
7 o/ I9 Y5 j9 L$ v, @  SQL> INSERT INTO T_P VALUES (1, ’A’);
9 y6 @0 G' H+ Y3 S/ P! @6 w0 Z/ @  已创建 1 行。
0 e( J, o2 `& m4 f  SQL> INSERT INTO T_P VALUES (2, ’B’);2 a0 k$ {# c' ~
  已创建 1 行。# p1 F( }9 ^+ Q. E7 y9 c+ a4 J
  SQL> INSERT INTO T_C VALUES (1, 1, ’A’);
. J* G; o. w0 @0 F  已创建 1 行。3 m% |3 O/ y& f7 A3 w) U) \/ D5 {
  SQL> INSERT INTO T_C VALUES (2, 2, ’B’);' ]3 M9 M; y: b& q% [6 X
  已创建 1 行。. l- y7 [/ v, J5 {. C5 t; S! q
  SQL> INSERT INTO T_C VALUES (3, 1, ’C’);$ d+ e+ O  m5 G( Y$ K( w
  已创建 1 行。
+ `+ @& v7 [- f  SQL> COMMIT;
5 j: t8 A! X9 {: E* t, e  提交完成。
4 \* a7 W/ Q- r1 j" \* E  下面看看CASCADE是如何工作的:2 N1 C% F6 C, I2 O/ x% k% ^+ G  u
  SQL> SELECT * FROM T_P;
  s; f+ R# X" y) o9 {* I4 t# f1 i  ID NAME
6 a) ]7 o1 C7 n8 }2 Y  ---------- ------------------------------
" c- ]! m5 [. a- h2 N) m" j) \  1 A& {. V7 H9 G1 c- U$ O( ?$ M. t
  2 B" @5 o( r2 O2 j: S7 t9 j
  SQL> SELECT * FROM T_C;
1 q' O8 v- R8 N3 s- O# }  ID FID NAME
+ i* Z& n) ]6 L& y( R2 A5 }$ p  ---------- ---------- ------------------------------/ u+ n; r: r& ^" p" S' y3 v
  1 1 A
. W5 h0 X9 J( A. o  2 2 B
3 m) P( ~, K$ }* ?. X- _8 d. c  3 1 C
- e7 v1 K) I7 N0 T) Z5 M  SQL> DELETE T_P WHERE ID = 2;& c; }3 g' q9 V, G* t
  已删除 1 行。
9 j! z9 i/ p+ W$ G( _: ?4 N  SQL> SELECT * FROM T_C;# K+ M* p& {$ o, T0 l* [
  ID FID NAME1 ~. d( c# W" \" P# z+ C# q
  ---------- ---------- ------------------------------
7 R. f: G: b! U* @5 x0 k  1 1 A# W$ s  U9 r0 Y  d( \7 Y" ?
  3 1 C
) x) P' A. ~" |+ ?3 `1 i! s* }! I1 x  SQL> UPDATE T_P SET ID = 3 WHERE ID = 1;
  R" D) C; \% G& x  UPDATE T_P SET ID = 3 WHERE ID = 1
回复

使用道具 举报

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

Oracle辅导:Oracle外键约束修改行为(三)

  *第 1 行出现错误:1 M" j; I  {5 M$ {) `3 X- B& X
  ORA-02292: 违反完整约束条件 (YANGTK.FK_T_C) - 已找到子记录日志" f! U/ N8 S5 r5 D) b9 Z# G
  可以看到,和SET TO NULL约束一样,CASCADE操作也是只对DELETE语句有效,而对于UPDATE语句不起作用。
* o, {6 D( A4 }* U! ?) j7 W  另外提一句,和SET TO NULL不同,CASCADE具有传递性,主表删除一条记录,会导致子表参考的记录被删除,而子表的记录被删除又会导致子表的子表记录被删除:7 i, Z6 @. Q4 s
  SQL> ALTER TABLE T_C ADD PRIMARY KEY (ID);$ S# Q9 |3 k- q: \! [
  表已更改。0 M- `; ^5 P2 O# d+ V
  SQL> CREATE TABLE T_C_C (ID NUMBER PRIMARY KEY, FID NUMBER,
) t& _3 O& h# E% i. S) h: C8 X  2 CONSTRAINT FK_T_C_C FOREIGN KEY (FID) REFERENCES T_C(ID) ON DELETE CASCADE);
& N3 K& T! K1 C  E" T4 U* |" O  表已创建。0 X0 n' e0 C" M
  SQL> INSERT INTO T_C_C VALUES (1, 1);/ O' s, O1 o- ?. d$ N
  已创建 1 行。% u9 Q( o2 I0 V, i
  SQL> CREATE TABLE T_C_C_C (ID NUMBER PRIMARY KEY, FID NUMBER, 5 \2 P- d. A5 k8 H! R3 u
  2 CONSTRAINT FK_T_C_C_C FOREIGN KEY (FID) REFERENCES T_C_C(ID) ON DELETE CASCADE);0 k3 }7 }/ B) o
  表已创建。
9 I. ^' N! U1 z& |5 d" X( B  SQL> INSERT INTO T_C_C_C VALUES (1, 1);
; x/ l2 v0 n  P: o- v9 B  已创建 1 行。, b" h& M4 j8 M" o
  SQL> COMMIT;0 P* ]" c6 O4 B2 b
  提交完成。* Z- R7 l% W- ~; t
  下面看看级联删除的效果:
: ]; U. Y2 j  _  SQL> SELECT * FROM T_P;
: }; U" x; M& j5 k0 b" h' r; A- f  ID NAME( K( b, H, r$ m( z2 p9 V! @
  ---------- ------------------------------4 ~) C+ m6 ]: ]; t
  1 A3 l! j  J$ r2 I
  SQL> SELECT * FROM T_C;$ R7 }# _: i% X/ A  _* s% l7 Q
  ID FID NAME
2 h; F, r2 z3 J. |3 \  ---------- ---------- ------------------------------  o8 L2 ]% N6 |/ j
  1 1 A3 |# m; S  X* R+ n3 u2 L) f
  3 1 C8 N' t# q0 V! P9 \' K5 {
  SQL> SELECT * FROM T_C_C;
; y1 Y: B# g# m4 s" E* r  ID FID
6 h) A& m* t! ~  ---------- ----------6 F  i3 p3 |- M4 o
  1 1
* Z" B! l8 P1 [7 u' \2 i& s& L  SQL> SELECT * FROM T_C_C_C;, D$ }# z3 P8 t6 @* J) B
  ID FID
* W( f" ~, a2 O6 n. g( r  ---------- ----------9 M( p' b+ u7 n6 I) P1 w3 Q0 @
  1 1
" h! K* E5 g% h( H& {( f! Q3 r  [  SQL> DELETE T_P;2 }8 W, R9 m& x0 P0 [' G( Y  W
  已删除 1 行。$ B/ ^3 [% \2 \
  SQL> SELECT * FROM T_P;
/ z, G  y$ c  b  未选定行
5 D8 o- b( J# Z5 ^" v4 k. D. Z  SQL> SELECT * FROM T_C;$ M% n, N$ E. G2 z, s1 X
  未选定行
! O8 L& l1 d% U, F  o" m  SQL> SELECT * FROM T_C_C;. D# M: \* \. ?; Y7 g- j
  未选定行- h2 H( r" P- f. ?- _! x# G8 a
  SQL> SELECT * FROM T_C_C_C;
+ M3 Q  l" v7 J  N+ e# d# d  未选定行
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 23:08 , Processed in 0.189861 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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