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会立刻检查非可延迟的
唯一约束,而不是按照标准建议的在语句结束时检查。