该【小议Oracle外键约束修改行为(五) 】是由【xx】上传分享,文档一共【5】页,该文档可以免费在线阅读,需要了解更多关于【小议Oracle外键约束修改行为(五) 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。
小议Oracle外键约束修改行为(五)
Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。
前面几篇文章介绍了Oracle所支持的3种约束行为NOACTION、,Oracle只能通过触发器来实现,这里给出一个简单的UPDATESETNULL操作的例子。
SQL>DROPTABLET_C;
表已删除。
SQL>DROPTABLET_P;
表已删除。
SQL>CREATETABLET_P(IDNUMBER,NAMEVARCHAR2(30));
表已创建。
SQL>ALTERTABLET_PADDPRIMARYKEY(ID);
表已更改。
SQL>CREATETABLET_C(IDNUMBER,FIDNUMBER,NAMEVARCHAR2(30));
表已创建。
SQL>ALTERTABLET_CADDCONSTRAINTFK_T_C
2FOREIGNKEY(FID)
3REFERENCEST_P(ID);
表已更改。
SQL>INSERTINTOT_PVALUES(1,’A’);
已创建1行。
SQL>INSERTINTOT_PVALUES(2,’B’);
已创建1行。
SQL>INSERTINTOT_CVALUES(1,1,’A’);
已创建1行。
SQL>COMMIT;
提交完成。
检查一下直接更新操作:
SQL>SELECT*FROMT_P;
IDNAME
----------------------------------------
1A
2B
SQL>SELECT*FROMT_C;
IDFIDNAME
--------------------------------------------------
11A
SQL>UPDATET_PSETID=3WHEREID=1;
UPDATET_PSETID=3WHEREID=1
*第1行出现错误:
ORA-02292:违反完整约束条件()-已找到子记录日志
下面构造一个触发器:
SQL>CREATEORREPLACETRIGGERT_P_UPDATE_SET_NULL
2BEFOREUPDATEONT_P
3FOREACHROW
4DECLARE
5V_STRVARCHAR2(32767);
6BEGIN
7IFNVL(:,-1)!=NVL(:,-1)THEN
8FORIIN(SELECTOWNER,TABLE_NAME,CONSTRAINT_NAME
9FROMALL_CONSTRAINTS
10WHERECONSTRAINT_TYPE=’R’
11ANDR_OWNER=’YANGTK’
12ANDR_CONSTRAINT_NAMEIN
13(SELECTCONSTRAINT_NAMEFROMUSER_CONSTRAINTSWHERETABLE_NAME=’T_P’))
14LOOP
15V_STR:=’UPDATE’||||’SET’;
16FORJIN(SELECTCOLUMN_NAMEFROMALL_CONS_COLUMNS
17WHEREOWNER=
18ANDTABLE_NAME=
19ANDCONSTRAINT_NAME=)
20LOOP
21V_STR:=V_STR||||’=NULL’
22||’WHERE’||||’=’||:;
23ENDLOOP;
24EXECUTEIMMEDIATEV_STR;
25ENDLOOP;
26ENDIF;
27END;
28/
触发器已创建
SQL>SELECT*FROMT_P;
IDNAME
----------------------------------------
1A
2B
SQL>SELECT*FROMT_C;
IDFIDNAME
--------------------------------------------------
11A
SQL>UPDATET_PSETID=3WHEREID=1;
已更新1行。
SQL>SELECT*FROMT_P;
IDNAME
----------------------------------------
3A
2B
SQL>SELECT*FROMT_C;
IDFIDNAME
--------------------------------------------------
1A
UPDATESETNULL操作其实和UPDATECASCADE很相似,不同之处无非是一个置为NULL,另一个置为主键的新值。
本文来源:网络收集与整理,如有侵权,请联系作者删除,谢谢!
小议Oracle外键约束修改行为(五) 来自淘豆网m.daumloan.com转载请标明出处.