SET CONSTRAINTS — 为当前事务设置约束检查时间
SET CONSTRAINTS { ALL | name
[, ...] } { DEFERRED | IMMEDIATE }
设置约束
设置当前事务中约束检查的行为。 立即
约束在每个语句结束后进行检查。 延迟
约束在提交事务之前不会进行检查。每个约束都有其自己的 立即
或 延迟
模式。
约束在创建时具有以下三个特征之一: 可延迟的初始延迟
、 可延迟的初始立即
或 不可延迟
。第三类始终为 立即
,不受 设置约束
命令的影响。前两类以指定的模式启动每个事务,但其行为可以通过 设置约束
在事务中进行更改。
设置约束
带有约束名称列表仅更改这些约束的模式(这些约束必须全部可延迟)。可以对每个约束名称进行架构限定。如果未指定架构名称,则使用当前架构搜索路径查找第一个匹配名称。 设置约束全部
更改所有可延迟约束的模式。
当 设置约束
将约束的模式从 延迟
更改为 立即
时,新模式会追溯生效:将在事务结束时进行检查的任何未执行的数据修改将在执行 设置约束
命令期间进行检查。如果违反了任何此类约束,则 设置约束
将失败(且不会更改约束模式)。因此,可以使用 设置约束
在事务中的特定点强制检查约束。
当前,仅 唯一
、 主键
、 引用
(外键)和 排除
约束受此设置影响。 非空
和 检查
约束总是在插入或修改行时立即进行检查(而不是 在语句结束时)。尚未声明 可延迟
的唯一性和排除性约束也会立即检查。
将触发器声明为 “约束触发器”的触发器的触发也受此设置控制 - 它们在应检查相关约束的同时触发。
由于 PostgreSQL 不要求约束名称在一个架构中唯一(仅针对每个表),因此,可能针对指定约束名称有多个匹配项。在这种情况下,SET CONSTRAINTS
将作用于所有匹配项。对于非架构限定名,一旦在搜索路径的某些架构中找到了匹配项或匹配项,路径中后续出现的架构将不会被搜索。
此命令仅更改当前事务中约束的行为。在事务块之外发出此命令会发出警告,否则无效。
此命令遵循 SQL 标准中定义的行为,但有以下限制:在 PostgreSQL 中,它不适用于 NOT NULL
和 CHECK
约束。另外,PostgreSQL 会立即检查不可延期的唯一性约束,而不是在语句末尾检查,这与标准建议的不符。