a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 226|回复: 1

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。" |& F3 [4 `* A8 c
  前面几篇文章介绍了Oracle所支持的3种约束行为NO ACTION、DELETE SET NULL和DELETE CASCADE.至于SQL标准中定义的其他操作,Oracle只能通过触发器来实现,这里给出一个简单的UPDATE SET NULL操作的例子。) M2 L1 [% J/ j1 Q, c
  SQL> DROP TABLE T_C;. A/ m( {  [/ J! v$ D
  表已删除。
+ W" U7 t  M! t7 v; K9 y: @  SQL> DROP TABLE T_P;3 ^8 v/ }- c' ^' C
  表已删除。
0 G! S  @* q2 m* C" L! p" o( U' |  SQL> CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));' s# y1 o% r( ?0 B1 L5 T, l' n
  表已创建。
: f5 M" G) Z( u/ r3 |7 O8 ~  SQL> ALTER TABLE T_P ADD PRIMARY KEY (ID);* I/ {4 Q4 {  p" k+ q# s
  表已更改。' o; G4 W- B7 N9 M5 X( c  |
  SQL> CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));
% X* H. s# i+ q) e  表已创建。
+ m/ V( X) U( ^3 \  SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C
' x3 O4 k# r& X7 i" R  2 FOREIGN KEY (FID)' n0 E2 I" I: ~
  3 REFERENCES T_P (ID);) L' Q/ v$ `8 {4 h
  表已更改。
) h" I( Y6 I9 R- i2 M9 }; Z  SQL> INSERT INTO T_P VALUES (1, ’A’);& d4 ^1 J0 D2 B7 V/ h. p; ?
  已创建 1 行。
. l* I+ J+ V5 ], l$ l  SQL> INSERT INTO T_P VALUES (2, ’B’);  u* {% S6 E7 y9 q, |2 u3 C5 G. \, J
  已创建 1 行。
2 a! [  ]) b7 r3 {  SQL> INSERT INTO T_C VALUES (1, 1, ’A’);
2 s* d" h' _+ j1 c8 J4 D  已创建 1 行。& w! K" l+ ]" ?4 z4 E8 N
  SQL> COMMIT;7 S4 \) A- j% w5 l. Y8 S
  提交完成。
. ]0 `- E# M! [6 j  检查一下直接更新操作:
3 {. ~$ d. I4 F# I5 g4 O' {0 n  SQL> SELECT * FROM T_P;
$ D5 F9 l( b& Y2 ]3 Q/ y; S  ID NAME) U- ?0 d3 N* e  ~, B6 J8 k1 R7 q
  ---------- ------------------------------
5 X/ j1 x9 X% w" ^  1 A4 c* Y5 H& D0 @# Q8 h$ w
  2 B
; l: V8 V  _! C- {: H  SQL> SELECT * FROM T_C;
5 I) R" u7 n4 Q/ T3 |; y! b  ID FID NAME0 G7 p( J+ j3 y& b% @
  ---------- ---------- ------------------------------- a8 u  U: R3 H- J
  1 1 A9 O. a) `/ @" ]. n
  SQL> UPDATE T_P SET ID = 3 WHERE ID = 1;
  [! ~9 I( w, }( A1 d* s' z6 G  UPDATE T_P SET ID = 3 WHERE ID = 1
回复

使用道具 举报

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

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

  *第 1 行出现错误:
" t7 q& s& F& u+ f% D/ _4 d( x+ U  ORA-02292: 违反完整约束条件 (YANGTK.FK_T_C) - 已找到子记录日志8 f6 }; \6 p' i# I# V6 y
  下面构造一个触发器:
  D4 M; E, e+ Y  SQL> CREATE OR REPLACE TRIGGER T_P_UPDATE_SET_NULL
: F3 B: J3 K) M) z: q' b, O/ I  2 BEFORE UPDATE ON T_P
8 Z0 s0 M! j& x$ D  3 FOR EACH ROW4 E* `$ z) v" Y2 x. n' U
  4 DECLARE
, F3 D' ~) m: s7 U2 h& a  R  5 V_STR VARCHAR2(32767);
6 ?1 X$ g3 ?# D+ _( c  6 BEGIN7 {% I+ x; X; b6 k8 n$ v
  7 IF NVL(:NEW.ID, -1) != NVL(:OLD.ID, -1) THEN0 W7 n+ {  C7 e* R2 Q) w  _# p# a& l
  8 FOR I IN (SELECT OWNER, TABLE_NAME, CONSTRAINT_NAME / L2 M  r* G! K. }4 X3 ^4 Q; O
  9 FROM ALL_CONSTRAINTS7 S, A, q% M7 o! Z; q3 U- Q4 c
  10 WHERE CONSTRAINT_TYPE = ’R’
1 k+ {/ W# H$ i8 \6 z  v7 T# O4 B7 T  11 AND R_OWNER = ’YANGTK’
0 v0 e) P( [8 X! j+ o+ E! W  12 AND R_CONSTRAINT_NAME IN 8 x! x* l) I4 O7 O/ r* U, N$ h( p
  13 (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = ’T_P’))+ t1 Y: v7 O5 t& K" g' h& x1 K, b
  14 LOOP
7 s6 L, s* F  E5 K* a  15 V_STR := ’UPDATE ’ || I.TABLE_NAME || ’ SET ’; / g) S% F: H7 ]
  16 FOR J IN (SELECT COLUMN_NAME FROM ALL_CONS_COLUMNS
4 x, b, R- ?; c& i3 K  17 WHERE OWNER = I.OWNER2 n4 ~% {" A. G4 N, [# u/ \1 T
  18 AND TABLE_NAME = I.TABLE_NAME
5 M6 S1 p) h+ H% D+ E* j; o  19 AND CONSTRAINT_NAME = I.CONSTRAINT_NAME)
7 z5 L3 |; E7 h  20 LOOP, J5 p. F+ n5 X1 X5 ?7 f' J1 w7 A8 k; p
  21 V_STR := V_STR || J.COLUMN_NAME || ’ = NULL ’
! l" d* O/ }2 z5 n- J  22 || ’WHERE ’ || J.COLUMN_NAME || ’ = ’ || :OLD.ID;
4 h. T& {0 {' u5 I+ k, V  23 END LOOP;& w0 s5 [( ~) T
  24 EXECUTE IMMEDIATE V_STR;
9 s( ^. b% ^3 L% p5 }  25 END LOOP;
2 u- a2 E% [6 u) F0 \6 g% B' d( ?  26 END IF;! p5 j$ E! P6 d) e
  27 END;& \4 j9 I' T% y9 c1 l( P1 n
  28 /
5 v* O! M) w& b. \0 e  触发器已创建/ J2 W% H) K3 v  S  ^1 |! N5 C
  SQL> SELECT * FROM T_P;1 c& }$ `7 U; v0 b
  ID NAME
* Q( W5 {  [: l1 F" ^  j- ?  ---------- ------------------------------
9 W( G+ _) o) ?( n9 o9 S  1 A
' ~$ l, K4 C: K3 k3 f  2 B
  D! c. G. K: a+ {" k  SQL> SELECT * FROM T_C;
$ Q4 `  E7 N! R* Z) b" t: h  ID FID NAME
1 H8 t& t2 t0 b% C! l& ?; k  ---------- ---------- ------------------------------& v/ ?+ I  L6 p) w# a) E* H5 y) O% d% Y
  1 1 A
4 l& b8 k6 C2 i, u8 [  SQL> UPDATE T_P SET ID = 3 WHERE ID = 1;
4 ~( S# }2 R' W2 b+ ~/ H  已更新 1 行。* _1 E9 E) ?6 b- [  m& A/ d
  SQL> SELECT * FROM T_P;: ~) r9 h$ F% T* r# |/ q2 K! @  Q
  ID NAME
( T# {6 y! u* F9 u; g  ---------- ------------------------------
! W% g0 l5 v0 S( q/ z  3 A8 h2 u: g% G$ D# G/ I7 }  i
  2 B8 V; {7 X2 c4 t; W& k/ _4 _
  SQL> SELECT * FROM T_C;/ k* I- N; q1 n8 K
  ID FID NAME9 v% o0 t' ]/ a: S$ G" a& \! |
  ---------- ---------- ------------------------------  y$ ~# F; d1 M" r% M
  1 A
) Q- O' l: w) E$ b8 T# u  UPDATE SET NULL操作其实和UPDATE CASCADE很相似,不同之处无非是一个置为NULL,另一个置为主键的新值。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 04:24 , Processed in 0.284082 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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