SET CONSTRAINTS

SET CONSTRAINTS —设置当前 Transaction 的约束检查时间

Synopsis

SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }

Description

SET CONSTRAINTS设置当前事务中的约束检查行为。在每个语句的末尾检查IMMEDIATE约束。 DEFERRED约束直到事务提交才检查。每个约束都有其自己的IMMEDIATEDEFERRED模式。

创建后,将为约束提供以下三个 Feature 之一:DEFERRABLE INITIALLY DEFERREDDEFERRABLE INITIALLY IMMEDIATENOT DEFERRABLE。第三类始终为IMMEDIATE,不受SET CONSTRAINTS命令的影响。前两个类以指示的模式启动每个事务,但是可以通过SET CONSTRAINTS在事务内更改其行为。

带有约束名称列表的SET CONSTRAINTS仅更改那些约束的模式(必须全部推迟)。每个约束名称可以是模式限定的。如果未指定架构名称,则使用当前架构搜索路径查找第一个匹配名称。 SET CONSTRAINTS ALL更改所有可延期约束的模式。

SET CONSTRAINTS将约束的模式从DEFERRED更改为IMMEDIATE时,新模式将 traceback 生效:在SET CONSTRAINTS命令执行期间,将检查在事务结束时已检查的所有未完成的数据修改。如果违反了任何此类约束,则SET CONSTRAINTS失败(并且不会更改约束模式)。因此,SET CONSTRAINTS可用于强制检查约束以在事务的特定点发生。

当前,此设置仅影响UNIQUEPRIMARY KEYREFERENCES(外键)和EXCLUDE约束。插入或修改行时,始终会立即检查NOT NULLCHECK约束(语句末尾* not *)。还立即检查尚未声明为DEFERRABLE的唯一性和排除约束。

声明为“约束触发器”的触发器的触发也由此设置控制-它们在应检查相关约束的同时触发。

Notes

因为 PostgreSQL 不需要约束名称在模式中唯一(仅按表),所以指定约束名称可能有多个匹配项。在这种情况下,SET CONSTRAINTS将对所有 match 起作用。对于非模式限定的名称,一旦在搜索路径中的某些模式中找到一个或多个匹配项,就不会搜索路径中稍后出现的模式。

此命令仅更改当前事务中约束的行为。在事务块外部发出此命令将发出警告,否则无效。

Compatibility

除了在 PostgreSQL 中不适用于NOT NULLCHECK约束的限制外,此命令符合 SQL 标准中定义的行为。另外,PostgreSQL 会立即检查不可延展的唯一性约束,而不是在标准声明的结尾处检查。