过着简单,真实的生活,喜欢收藏变形金刚(TFE,G1,SL系列),研究金融股市,KOF98,篮球,学习研究Oracle技术,我并不是一个全职的Oracle DBA,但是对于Oracle技术的热爱和研究,是一个不争的事实,愿意结交广大Oracle技术爱好者!MSN:oracle_kof_tf@hotmail.com

完整性约束和事务

上一篇 / 下一篇  2007-12-27 21:43:16 / 个人分类:Oracle数据库技术-SQL

Immediate Constraints
--------------------------------
这种约束一般就是我们默认的约束模式,完整性约束一般是在SQL语句得到处理之后才会立即检查,那么为什么要在SQL语句执行之后检查,而不是在SQL语句执行期间呢?
主要就是为了解决的"temp inconsistent"的问题。
来看一个例子
SQL> create table t
  2  (x int unique);

表已创建。

SQL> insert into t values (1);

已创建 1 行。

SQL> insert into t values (2);

已创建 1 行。

SQL>update t set x = x + 1;

已更新2行。

由于我们的SQL语句的处理会按照行的顺序来进行,在处理更新完第一行的时候,值已经又1变为了2,和第二行的2正好有了unquie约束的冲突。这样update就不会顺利进行了,由此我们可以判断,在immediate模式下呢,完整性约束的检查是在SQL语句执行之后开始的

Deferrable Constraints
-------------------------------
这类限制型约束主要就是为了延迟约束的检查,可以想象一个cascade的update操作,一般来将,因为有了主外键的约束,对于父表中已别子表做为外键而引用的主键的更新一般,是会被约束检查为违反规则的情况。那么通过如下的测试我们可以实现分阶段更新,这样的主键:
SQL> create table p
  2  (pk int primary key);

表已创建。

SQL> create table c
  2  (fk constraint c_fk references p(pk)
  3  deferrable
  4  initially immediate);

表已创建。

SQL> insert into p values (1);

已创建 1 行。

SQL> insert into c values (1);

已创建 1 行。

SQL> update p set pk=2;
update p set pk=2
*
ERROR 位于第 1 行:
ORA-02292: 违反完整约束条件 (SYS.C_FK) - 已找到子记录日志

SQL>set constraint c_fk deferred;

约束条件已设置。

SQL> update p set pk=2;

已更新 1 行。

SQL> set constraint c_fk immediate;
SET constraint c_fk immediate
*
ERROR 位于第 1 行:
ORA-02291: 违反完整约束条件 (SYS.C_FK) - 未找到父项关键字

SQL> commit;
commit
*
ERROR 位于第 1 行:
ORA-02091: 事务处理已重算
ORA-02292: 违反完整约束条件 (SYS.C_FK) - 已找到子记录日志。

而如果之前,我们在提交之前继续更新c表将其中的fk的value设置为pk修改后的value。commit就会成功。否则还是会失败。


TAG:

引用 删除 能再解释一下吗?   /   2008-04-16 13:47:45
还是不明白。。。。。
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar