Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。# a: X7 q$ f$ o9 i1 R! P
前面几篇文章介绍了Oracle所支持的3种约束行为NO ACTION、DELETE SET NULL和DELETE CASCADE.至于SQL标准中定义的其他操作,Oracle只能通过触发器来实现,这里给出一个简单的UPDATE SET NULL操作的例子。1 \. W) V7 |* b/ d6 |: G6 G
SQL> DROP TABLE T_C;
# }! {! o+ K4 N! O 表已删除。
* d9 e4 \( Y& Y SQL> DROP TABLE T_P;7 V [" G! H% j% U& y
表已删除。 g0 A# w( \5 n+ ~, v1 c1 i
SQL> CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));
0 [8 }7 I$ k- I- W! Y7 V5 E. f& Z 表已创建。1 A. y$ R. ~2 m/ _' ]1 }
SQL> ALTER TABLE T_P ADD PRIMARY KEY (ID);
: _7 I1 r& V- S' }) d 表已更改。
5 r- o1 X! {( h* D2 L( @ SQL> CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));' b$ F! N1 u; T
表已创建。! F/ I. P0 B% a3 S9 {9 J
SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C
' u& D) B, S+ ~$ E& ^* `( ]* Y 2 FOREIGN KEY (FID)# C# S, L1 u0 L5 r0 S! L0 c
3 REFERENCES T_P (ID);- O4 e+ k3 H9 \1 ?) R# n
表已更改。& L) H0 _' g# P- I
SQL> INSERT INTO T_P VALUES (1, ’A’);" e" [( T* b. f
已创建 1 行。. |2 R) r+ z6 b! x, {" O
SQL> INSERT INTO T_P VALUES (2, ’B’);
0 j+ l2 b% i$ g 已创建 1 行。
/ H" h8 v, W' s; [) @6 a7 N6 y( F; m SQL> INSERT INTO T_C VALUES (1, 1, ’A’);
6 o7 F1 s# y$ f 已创建 1 行。% [0 x* M3 O. u* ]) W6 l! r
SQL> COMMIT;* t9 K$ O! j: p! w" }* {& `
提交完成。
/ a$ u+ w" `: g' L$ r 检查一下直接更新操作:
& w8 P& y: s ~7 k# l9 u SQL> SELECT * FROM T_P;
q+ R* Q% `: o) D. ~ `4 u$ B ID NAME1 ^3 n- n+ K" P# g
---------- ------------------------------
* f+ H+ J6 W$ S8 F% A; L 1 A
! B# v% O$ [: F, `& z& ? 2 B
b7 _. R7 |: f, c( c6 ^ y* Y SQL> SELECT * FROM T_C;6 f& m, O$ U5 E# }
ID FID NAME9 A) \3 n7 n. k! K3 E. w$ z: r" c
---------- ---------- ------------------------------# l$ A/ z; C. _' E
1 1 A
8 _; W- N4 L) J/ U4 {6 P7 a+ \ SQL> UPDATE T_P SET ID = 3 WHERE ID = 1;5 f! Z! n2 S, V
UPDATE T_P SET ID = 3 WHERE ID = 1 |