SET CONSTRAINTS — 设置当前事务的约束检查时机
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
SET CONSTRAINTS 设置当前事务中约束检查的行为。IMMEDIATE 约束在每个语句结束时检查。DEFERRED 约束直到事务提交时才检查。每个约束都有自己的 IMMEDIATE 或 DEFERRED 模式。
创建时,约束会被赋予以下三种特性之一: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 可用于强制在事务中的特定点进行约束检查。
目前,只有 UNIQUE、PRIMARY KEY、REFERENCES(外键)和 EXCLUDE 约束会受此设置的影响。NOT NULL 和 CHECK 约束始终在插入或修改行时立即检查(不是在语句结束时)。未声明为 DEFERRABLE 的唯一性和排除约束也会立即检查。
声明为“约束触发器”的触发器的触发也由该设置控制——它们会在应该检查相关约束的同时触发。
因为 PostgreSQL 不要求约束名称在模式内唯一(但每个表内唯一),因此指定的约束名称可能存在多个匹配项。在这种情况下,SET CONSTRAINTS 将作用于所有匹配项。对于非模式限定的名称,一旦在搜索路径中的某个模式中找到一个或多个匹配项,则不会搜索路径中稍后出现的模式。
此命令仅更改当前事务中约束的行为。在事务块之外发出此命令会发出警告,否则不会有任何影响。
此命令符合 SQL 标准中定义的行为,但限制是,在 PostgreSQL 中,它不适用于 NOT NULL 和 CHECK 约束。此外,PostgreSQL 会立即检查不可延迟的唯一性约束,而不是像标准建议的那样在语句结束时检查。
如果您在文档中看到任何不正确的内容,或者与特定功能的体验不符,或者需要进一步澄清,请使用此表格报告文档问题。