选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / SQL 命令 / 事务控制

SQL COMMAND · 事务控制

SET CONSTRAINTS

为当前事务设置约束检查时机

SET事务控制引入 10(基线)现存至 20 devel0 次语法变更

动词
SET
对象
CONSTRAINTS
引入版本
10(基线)
状态
现存
语法变更次数
0
手册小节数
3

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

SET CONSTRAINTS ALL name , DEFERRED IMMEDIATE

语法概要

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

PostgreSQL 18 手册 · 查看完整参考页

描述

SET CONSTRAINTS设置当前事务中约束检查 的行为。IMMEDIATE约束会在每条语句结束时检查。 DEFERRED约束要等到事务提交时才检查。每个约束都 有各自的IMMEDIATEDEFERRED模式。

创建约束时,它会被赋予以下三种特性之一: DEFERRABLE INITIALLY DEFERREDDEFERRABLE 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会立即检查不可延迟的 唯一约束,而不是像标准所暗示的那样在语句结束时检查。

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. 收录以来没有记录到变化。

同组命令

命令动词对象版本变动最近变更
TRANSACTIONS事务控制15 条
ABORTABORT 121 次
中止当前事务现存
BEGINBEGIN
开始一个事务块现存
COMMITCOMMIT 121 次
提交当前事务现存
ENDEND 121 次
提交当前事务现存
ROLLBACKROLLBACK 121 次
中止当前事务现存
SAVEPOINTSAVEPOINT
在当前事务中定义一个新的保存点现存
SET CONSTRAINTSSETCONSTRAINTS
为当前事务设置约束检查时机现存
WAIT FORWAITFOR
等待 WAL 达到目标 LSN现存
COMMIT PREPAREDCOMMITPREPARED
提交一个先前为两阶段提交而预备的事务现存
ROLLBACK PREPAREDROLLBACKPREPARED
回滚一个先前为两阶段提交而预备的事务现存
RELEASE SAVEPOINTRELEASESAVEPOINT
释放一个先前定义的保存点现存
ROLLBACK TO SAVEPOINTROLLBACKTO SAVEPOINT
回滚到一个保存点现存
PREPARE TRANSACTIONPREPARETRANSACTION
为两阶段提交准备当前事务现存
SET TRANSACTIONSETTRANSACTION
设置当前事务的特性现存
START TRANSACTIONSTARTTRANSACTION
开始一个事务块现存