2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

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 会立即检查不可延迟的唯一性约束,而不是像标准建议的那样在语句结束时检查。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单 报告文档问题。