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可以用于强制在事务中某一点进行约束检查。
目前,仅UNIQUE, PRIMARY KEY,REFERENCES (外键), 和EXCLUDE约束受该设置影响。NOT NULL和CHECK 约束总在一行被插入或者调整时被检查(不在语句末)。未声明 DEFERRABLE的唯一性和排斥性约束也立即检查。
被声明为"constraint triggers"的触发器的触发也是受该设置控制的— 他们在相关约束应被检查的相同时间触发。
因为PostgreSQL不要求约束名称在一个模式内是独一无二的 (但仅是每个表的),多于一个约束名匹配一个特定约束名是可能的。在这种情况下, SET CONSTRAINTS将作用于所有的匹配。对于一个无模式修饰的名称, 一旦一个或多个匹配在搜索路径下的相同模式被找到,路径中晚出现的模式不会被找到。
这个命令只在当前事务里修改约束的行为。因此, 如果你在事务块之外(BEGIN/COMMIT对)执行这个命令, 它将没有任何作用。