惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园 - .net学习交流

Oracle profile详解 ORACLE使用JOB定时备份数据库 干掉标记为KILLED的session Oracle直方图详解(转) Export/Import DataPump Parameter QUERY - How to Specify a Query 一个完整的RMAN备份脚本 Oracle 10g的新特性flashback IBM AIX V5.3 磁盘存储管理 跨平台表空间传输(摘自eygle《循序渐进Oracle》) ORACLE EXP/IMP的使用详解 RMAN命令详解 Oracle中使用可传输表空间备份数据 一致性读(Consistent Reads)与buffer cache Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据 oracle 游标属性 sql%found sql%notfound sql%rowcount 在存储过程中指定回滚段 EXP-00003: 未找到段 (11,419) 的存储定义解决方法 AIX上设置LOCK_SGA=TRUE 很容易理解的IN和EXISTS区别
定义可延迟(deferrable)的约束 - .net学习交流 - 博客园
.net学习交流 · 2009-06-28 · via 博客园 - .net学习交流

"定义为可延迟(deferrable)的约束可以指定为:

  1. initially immediate(初始化立即执行)或

  2. initially deferred(初始化延迟执行)。"

  我知道什么是延迟约束,但不明白什么叫"初始化立即执行的可延迟约束"和"初始化延迟执行的可延迟约束"。请解释二者的区别。还有,这些约束有什么用途?这是通常容易混淆的问题。我希望下面的例子能解释清楚。初始化立即执行/延迟执行规定了在默认情况下应该如何执行约束:

  初始化立即执行--在每条语句执行结束时检验约束

  初始化延迟执行--一直等到事务完成后(或者调用set constraint immediate语句时)才检验约束

  来看下面的代码:

  SQL> create table t

  2  ( x int constraint  check_x check ( x > 0 )

  deferrable

  initially immediate,

  3  y int constraint  check_y check ( y > 0 )

  deferrable

  initially deferred

  4  )

  5  /

  Table created.

  SQL> insert into t values ( 1,1 );

  1 row created.

  SQL> commit;

  Commit complete.

  所以,当两个约束同时满足时才能正确无误地插入行。但是,如果我试图插入违反CHECK_X约束(初始化立即执行的约束)的行,则系统会立即检验约束,并得到下面的结果:

  SQL> insert into t values ( -1,1);

  insert into t values ( -1,1)

  *

  ERROR at line 1:

  ORA-02290: check constraint

  (OPS$TKYTE.CHECK_X) violated

  由于CHECK_X是可延迟但初始化为立即执行的约束,所以这一行立刻被拒绝了。而CHECK_Y则不同,它不仅是可延迟的,而且初始化为延迟执行,这就意味着直到我用COMMIT命令提交事务或将约束状态设置为立即执行时才检验约束。

  SQL> insert into t values ( 1,-1);

  1 row created.

  现在它是成功的(总之到目前为止是成功的)。我将约束检验延迟到了执行COMMIT的时候:

  SQL> commit;

  commit

  *

  ERROR at line 1:

  ORA-02091: transaction rolled back

  ORA-02290: check constraint

  (OPS$TKYTE.CHECK_Y) violated

  此时数据库将事务回滚,因为违反约束导致了COMMIT语句的失败。这些语句说明了初始化立即执行与初始化延迟执行约束之间的区别。initially(初始化)部分指定Oracle什么时候会进行默认的约束检验--是在语句结束时[immediate(立即执行)],还是在事务结束时[deferred(延迟执行)]。我还要说明deferred(可延迟)子句有什么用。我可以发出命令,让所有可延迟的约束变为延迟执行的。注意,你也可以对一个约束使用该命令;你不必让所有可延迟的约束都变为延迟执行的:

  SQL> set constraints all deferred;

  Constraint set.

  SQL> insert into t values ( -1,1);

  1 row created.

  由于将初始化立即执行的约束设置为延迟执行的模式,这个语句似乎执行成功;但是,当我用COMMIT语句提交事务时,看一下会发生什么:

  SQL> commit;

  commit

  *

  ERROR at line 1:

  ORA-02091: transaction rolled back

  ORA-02290: check constraint

  (OPS$TKYTE.CHECK_X) violated

  事务提交失败并回滚,因为在COMMIT语句之后对约束进行了检验。相反,我可以将初始化为延迟执行的约束变为"立即"执行的约束:

  SQL> set constraints all immediate;

  Constraint set.

  SQL> insert into t values ( 1,-1);

  insert into t values ( 1,-1)

  *

  ERROR at line 1:

  ORA-02290: check constraint

  (OPS$TKYTE.CHECK_Y) violated

  前面在我提交前能执行的语句现在立即出了问题。因为我手动修改了默认的约束模式。