Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。
* M* F! F/ E, K, ~+ S+ U+ q 前面几篇文章介绍了Oracle所支持的3种约束行为NO ACTION、DELETE SET NULL和DELETE CASCADE.至于SQL标准中定义的其他操作,Oracle只能通过触发器来实现,这里给出一个简单的UPDATE CASCADE操作的例子。( Z* u6 g' h/ w7 p- n# r5 X4 P
SQL> DROP TABLE T_C;
4 i- i4 ?+ R$ f1 m+ t3 s. c1 a7 [ 表已删除。/ N/ i0 I r( X$ X% O9 [) \) \( y
SQL> DROP TABLE T_P;
# ?* P; K7 O* N: i2 I- ? 表已删除。; y7 | \, m1 r6 ^. `% A% V$ D
SQL> CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));
1 ^- a5 j2 c0 F7 A. {. B3 m# z 表已创建。
# j0 R3 Z" M: Y: {/ _9 E1 a SQL> ALTER TABLE T_P ADD PRIMARY KEY (ID);4 N- \$ X& x9 c6 X0 z) U
表已更改。
# q9 e, J6 N: w, \" n SQL> CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));
( R. R& Q% F! V8 S: o# v } 表已创建。1 l, F p* h; C/ `3 D% u
SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C; I- Q/ P5 M! l- r
2 FOREIGN KEY (FID)
: b0 J! K) i7 s- d9 k 3 REFERENCES T_P (ID);% J. f2 Y D( R$ j0 K) x- M* F
表已更改。) |0 Z, z2 L- r& }8 o
SQL> INSERT INTO T_P VALUES (1, ’A’);! Q; {2 m' f# G/ E
已创建 1 行。: U0 L4 K% L R2 z2 v4 ^5 M9 L& ]
SQL> INSERT INTO T_P VALUES (2, ’B’);
% q+ h3 u$ g$ u: T3 z* S 已创建 1 行。# }/ Y( |. w2 ?# r: R$ W, {
SQL> INSERT INTO T_C VALUES (1, 1, ’A’);
% _7 z q2 [% e/ _4 x/ n 已创建 1 行。) m) P' r( x# ^7 M0 o
SQL> COMMIT;& @: H* _5 {1 }; w9 H0 d4 i
提交完成。
: F' o. ~. Q! Z# X 检查一下直接更新操作:2 j5 E4 l3 D7 }2 c0 k" E# ^$ O [
SQL> SELECT * FROM T_P;9 N) g" E) `: h( C" E
ID NAME% f3 ^, A6 X0 p6 _2 u2 q6 G9 H- W' t
---------- ------------------------------/ j: e" S: d6 q$ Y
1 A
9 k: T7 a1 T+ h9 h 2 B
# I' f' Q6 s7 X- k2 p) y SQL> SELECT * FROM T_C;
: A+ d2 k! W# Z7 |: h/ e4 c7 G' b ID FID NAME
. E/ _/ { R: v6 Z$ }, j* _8 Q ---------- ---------- ------------------------------
7 K. D, O0 _4 R# J 1 1 A& B/ V7 a" F/ w, y0 v
SQL> UPDATE T_P SET ID = 3 WHERE ID = 1;
: E# a+ \* p+ \ UPDATE T_P SET ID = 3 WHERE ID = 1" C6 L" i* ` Y/ E4 w
*第 1 行出现错误:! S1 P& R4 F8 i$ I1 a% U# s
ORA-02292: 违反完整约束条件 (YANGTK.FK_T_C) - 已找到子记录日志 |