PostgreSQL 外键约束的一些问题 DEFERRABLE, NOT DEFERRABLE,INITIALLY IMMEDIATE 和 INITIALLY DEFERRED

dodojava 发布于 2013/04/24 10:15
阅读 1K+
收藏 0
http://www.postgresql.org/docs/9.2/static/sql-createtable.html

DEFERRABLE
NOT DEFERRABLE

This controls whether the constraint can be deferred. A constraint that is not deferrable will be checked immediately after every command. Checking of constraints that are deferrable can be postponed until the end of the transaction (using the SET CONSTRAINTS command).NOT DEFERRABLEis the default. Currently, onlyUNIQUE,PRIMARY KEY,EXCLUDE, andREFERENCES(foreign key) constraints accept this clause.NOT NULLandCHECKconstraints are not deferrable.

INITIALLY IMMEDIATE
INITIALLY DEFERRED

If a constraint is deferrable, this clause specifies the default time to check the constraint. If the constraint isINITIALLY IMMEDIATE, it is checked after each statement. This is the default. If the constraint isINITIALLY DEFERRED, it is checked only at the end of the transaction. The constraint check time can be altered with the SET CONSTRAINTS command.

找了一些中文参考,这个有点旧
http://www.oschina.net/question/565065_66608

DEFERRABLE
NOT DEFERRABLE

这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。 可以推迟的约束检查可以推迟到事务结尾(使用 SET CONSTRAINTS 命令)。 缺省是NOT DEFERRABLE。目前只有外键约束接受这个子句。所有其它约束类型都是不可推迟的。

INITIALLY IMMEDIATE
INITIALLY DEFERRED

如果约束是可推迟的,那么这个子句声明检查约束的缺省时间。 如果约束是INITIALLY IMMEDIATE, 那么每条语句之后就检查它。这个是缺省。如果约束是INITIALLY DEFERRED,那么只有在事务结尾才检查它。 约束检查的时间可以用 SET CONSTRAINTS 命令修改。

----------------------以上都是参考信息--------------------

我的问题是NOT DEFERRABLE设置了可以推迟到事务结尾执行约束,为什么还有INITIALLY IMMEDIATE 和 INITIALLY DEFERRED的区别?

如果设置了NOT DEFERRABLE 和 INITIALLY IMMEDIATE,那和设置成DEFERRABLE有什么区别?

大神们帮忙讲讲,说说这些条件触发的详细情况,谢谢各位大神。

加载中
1
kenyon_君羊
kenyon_君羊
非延迟是立即生效的,不允许延迟 
延迟生效初始化立即生效是对每个语句结束时检查,但可使set constraint延迟
延迟生效初始化延迟生效是直到事务完成才检查(可使用set constraints调整) ,可参考:http://my.oschina.net/Kenyon/blog/126360
mark35
mark35
回复 @kenyon(君羊) : 基本上postgres的功能都是参照oracle来设计的
kenyon_君羊
kenyon_君羊
和ORACLE稍有出入,不过总体是一样的,这些参数在Postgres和Oraclel里通常取的默认值
dodojava
dodojava
谢谢,后来我参照Oracle的,基本弄懂了,谢谢
返回顶部
顶部