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

SET CONSTRAINTS

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

概要

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

描述

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 约束总是在插入或修改行时立即检查(而不是 在语句结束时检查)。尚未声明为 DEFERRABLE 的唯一性和排除性约束也会立即检查。

声明为 约束触发器 的触发器的触发也受此设置控制——它们与应检查关联约束的时间同时触发。

注释

由于 PostgreSQL 不要求约束名称在模式内唯一(仅按表唯一),因此可能有多个与指定约束名称匹配的约束。在这种情况下,SET CONSTRAINTS 将对所有匹配项执行操作。对于非模式限定名称,一旦在搜索路径中的某个模式中找到匹配项,则不会搜索路径中后面出现的模式。

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

兼容性

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