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 |