欢迎来到天天文库
浏览记录
ID:38521045
大小:109.00 KB
页数:25页
时间:2019-06-14
《小议Oracle外键约束修改行为》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、小议Oracle外键约束修改行为(一)Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。 在SQL92标准中定义了几种外键改变后,如何处理子表记录的动作,其中包括: 限制Restrict:这种方式不允许对被参考的记录的键值执行更新或删除的操作;置为空Settonull:当参考的数据被更新或者删除,那么所有参考它的外键值被置为空; 置为默认值Settodefault:当参考的数据被更新或者删除,那么所有参考它的外键值被置为一个默认值;
2、级联Cascade:当参考的数据被更新,则参考它的值同样被更新,当参考的数据被删除,则参考它的子表记录也被删除; 不做操作Noaction:这种方式不允许更新或删除被参考的数据。和限制方式的区别在于,这种方式的检查发生在语句执行之后。Oracle默认才会的方式就是这种方式。 Oracle明确支持的方式包括Noaction、Settonull和Cascade.对于SettoDefault和Restrict,Oracle的约束类型并不直接支持,不过可以通过触发器来实现。 简单看一下Oracle的默认处理方式Noaction:SQL>CR
3、EATETABLET_P(IDNUMBER,NAMEVARCHAR2(30));表已创建。SQL>ALTERTABLET_PADDPRIMARYKEY(ID);表已更改。SQL>CREATETABLET_C(IDNUMBER,FIDNUMBER,NAMEVARCHAR2(30));表已创建。SQL>ALTERTABLET_CADDCONSTRAINTFK_T_C2FOREIGNKEY(FID)3REFERENCEST_P(ID);表已更改。SQL>INSERTINTOT_PVALUES(1,'A');已创建1行。SQL>INSERTINTOT_
4、PVALUES(2,'B');已创建1行。SQL>INSERTINTOT_CVALUES(1,1,'A');已创建1行。SQL>COMMIT;提交完成。对于NoAction操作而言,如果主键的记录被外键所参考,那么主键记录是无法更新或删除的。SQL>DELETET_PWHEREID=1;DELETET_PWHEREID=1*第1行出现错误:ORA-02292:违反完整约束条件(YANGTK.FK_T_C)-已找到子记录日志SQL>UPDATET_PSETID=3WHEREID=1;UPDATET_PSETID=3WHEREID=1*第1行出现错
5、误:ORA-02292:违反完整约束条件(YANGTK.FK_T_C)-已找到子记录日志SQL>DELETET_PWHEREID=2;已删除1行。不过NoAction又和Restrict操作有所区别,NoAction允许用户执行语句,在语句执行之后,或者事务结束的时候才会检查是否违反约束。而Restrict只有检测到有外键参考主表的记录,就不允许删除和更新的操作执行了。这也使得NoAction操作支持延迟约束:SQL>ALTERTABLET_CDROPCONSTRAINTFK_T_C;表已更改。SQL>ALTERTABLET_CADDCONST
6、RAINTFK_T_C2FOREIGNKEY(FID)3REFERENCEST_P(ID)4DEFERRABLEINITIALLYDEFERRED;表已更改。SQL>SELECT*FROMT_P;IDNAME----------------------------------------1ASQL>SELECT*FROMT_C;IDFIDNAME--------------------------------------------------11ASQL>DELETET_PWHEREID=1;已删除1行。SQL>INSERTINTOT_PVA
7、LUES(1,'A');已创建1行。SQL>COMMIT;提交完成。小议Oracle外键约束修改行为(二)Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在。而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作。 这篇简单描述一下SETTONULL操作。 上一篇描述了Oracle外键处理默认操作:NoAction,这里简单介绍一下SETTONULL操作。还是利用前面例子的表,不过约束需要重建。SQL>DROPTABLET_C;表已删除。SQL>DROPTABLET_P;表已删除。SQL>CREAT
8、ETABLET_P(IDNUMBER,NAMEVARCHAR2(30));表已创建。SQL>ALTERTABLET_PADDPRIMARYKEY(ID
此文档下载收益归作者所有