SET CONSTRAINTS 设置当前事务里的约束检查的特性。IMMEDIATE 约束是在每条语句后面进行检查。DEFERRED 约束一直到事务提交时才检查。每个约束都有自己的 IMMEDIATE 或 DEFERRED 模式。
从创建的时候开始,一个约束总是给定为 DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE, NOT DEFERRABLE 三个特性之一。第三种总是 IMMEDIATE ,并且不会受 SET CONSTRAINTS 影响。头两种以指定的方式启动每个事务,但是他们的行为可以在事务里用 SET CONSTRAINTS 改变。
带着一个约束名列表的 SET CONSTRAINTS 改变这些约束的模式(都必须是可推迟的)。如果有多个约束匹配某个名字,那么所有都会被影响。SET CONSTRAINTS ALL 改变所有可推迟约束的模式。
当 SET CONSTRAINTS 把一个约束从 DEFERRED 改成 IMMEDIATE 的时候,新模式反作用式地起作用:任何将在事务结束准备进行的数据修改都将在 SET CONSTRAINTS 的时候执行检查。如果违反了任何约束,SET CONSTRAINTS 都会失败(并且不会修改约束模式)。因此,SET CONSTRAINTS 可以用于强制在事务中某一点进行约束检查。
目前,只有外键约束被这个设置影响。检查和唯一约束总是不可推迟的。