SET CONSTRAINTS — 为当前事务设置约束检查时机
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
   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的唯一和排除约束也会被
   立刻检查。
  
被声明为“约束触发器”的触发器的引发也受到这个设置 的控制 — 它们会在相关约束被检查的同时被引发。
   因为PostgreSQL并不要求约束名称在模式内
   唯一(但是在表内要求唯一),可能有多于一个约束匹配指定的约束名称。在这种
   情况下SET CONSTRAINTS将会在所有的匹配上操作。
   对于一个非模式限定的名称,一旦在搜索路径中的某个模式中发现一个或者多个匹
   配,路径中后面的模式将不会被搜索。
  
这个命令只修改当前事务内约束的行为。在事务块外部发出这个命令会产生一个 警告并且也不会有任何效果。
   这个命令符合 SQL 标准中定义的行为,但有一点限制:在
   PostgreSQL中,它不会应用在
   NOT NULL和CHECK约束上。还有,
   PostgreSQL会立刻检查非可延迟的
   唯一约束,而不是按照标准建议的在语句结束时检查。