Postgresql 中文操作指南

SET CONSTRAINTS

SET CONSTRAINTS — 为当前事务设置约束检查时间

Synopsis

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

Description

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

在创建时,约束将获得以下三个特征之一: DEFERRABLE INITIALLY DEFERREDDEFERRABLE INITIALLY IMMEDIATENOT DEFERRABLE 。第三类始终为 IMMEDIATE ,不会受 SET CONSTRAINTS 命令影响。前两类以指示的模式启动每个事务,但其行为可以在事务中通过 SET CONSTRAINTS 进行更改。

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

SET CONSTRAINTS 将约束的模式从 DEFERRED 更改为 IMMEDIATE 时,新模式会产生追溯效应:在事务末尾才会检查的任何未完成数据修改反而会在执行 SET CONSTRAINTS 命令期间进行检查。如果违反了任何此类约束, SET CONSTRAINTS 将会失败(且不会更改约束模式)。因此, SET CONSTRAINTS 可以用来强制在事务中的特定点检查约束。

目前,只有 UNIQUEPRIMARY KEYREFERENCES (外键)和 EXCLUDE 约束会受此设置影响。在插入或修改行时,总是会立即检查 NOT NULLCHECK 约束(在语句末尾检查 not )。没有声明为 DEFERRABLE 的唯一性约束和排他约束也立即进行检查。

声明为“约束触发器”的触发器的触发也受此设置控制 — 约束应在触发器触发同时进行检查。

Notes

由于 PostgreSQL 并未要求约束名称在架构内保持唯一(仅每张表一个),因此指定一个约束名称可能有多个匹配项。在这种情况下, SET CONSTRAINTS 会对所有匹配项采取操作。对于非架构限定名称,一旦在搜索路径中的某些架构中找到了匹配项,就不会搜索路径中后面出现的架构。

此命令仅更改当前事务中约束的行为。在事务块外部发布此命令会发出警告,否则没有任何效果。

Compatibility

此命令符合 SQL 标准中定义的行为,但有一个限制例外,即在 PostgreSQL 中,它不适用于 NOT NULLCHECK 约束。此外,PostgreSQL 会立即检查不可延迟的唯一性约束,而非在语句末尾进行检查,就像标准建议的那样。