Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

SET CONSTRAINTS

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

摘要

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

描述

设置约束设置当前事务中约束检查的行为。 立即约束在每个语句结束后进行检查。 延迟约束在提交事务之前不会进行检查。每个约束都有其自己的 立即延迟模式。

约束在创建时具有以下三个特征之一: 可延迟的初始延迟可延迟的初始立即不可延迟。第三类始终为 立即,不受 设置约束命令的影响。前两类以指定的模式启动每个事务,但其行为可以通过 设置约束在事务中进行更改。

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

设置约束将约束的模式从 延迟更改为 立即时,新模式会追溯生效:将在事务结束时进行检查的任何未执行的数据修改将在执行 设置约束命令期间进行检查。如果违反了任何此类约束,则 设置约束将失败(且不会更改约束模式)。因此,可以使用 设置约束在事务中的特定点强制检查约束。

当前,仅 唯一主键引用(外键)和 排除约束受此设置影响。 非空检查约束总是在插入或修改行时立即进行检查(而不是 在语句结束时)。尚未声明 可延迟的唯一性和排除性约束也会立即检查。

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

说明

由于 PostgreSQL 不要求约束名称在一个架构中唯一(仅针对每个表),因此,可能针对指定约束名称有多个匹配项。在这种情况下,SET CONSTRAINTS 将作用于所有匹配项。对于非架构限定名,一旦在搜索路径的某些架构中找到了匹配项或匹配项,路径中后续出现的架构将不会被搜索。

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

兼容性

此命令遵循 SQL 标准中定义的行为,但有以下限制:在 PostgreSQL 中,它不适用于 NOT NULLCHECK 约束。另外,PostgreSQL 会立即检查不可延期的唯一性约束,而不是在语句末尾检查,这与标准建议的不符。