2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 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 DEFERRED(可推迟,初始时推迟)、DEFERRABLE INITIALLY IMMEDIATE(可推迟,初始时立即)或 NOT 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 会立即检查不可推迟的唯一性约束,而不是在语句结束时检查,这一点与标准建议不同。

提交更正

如果您在文档中发现任何不正确、与您使用该特定功能时的经验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。