SET CONSTRAINTS

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

注意!
引用完整性语法(外键约束)被接受但不强制执行。

概要

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

描述

SET CONSTRAINTS 用于设置当前事务中约束检查的行为。IMMEDIATE 约束在每条语句执行结束时检查;DEFERRED 约束则延迟至事务提交时才检查。每个约束均可独立设置为 IMMEDIATE 或 DEFERRED 模式。

约束创建时具有三种特性之一: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的唯一性约束和排除约束同样会立即检查。

此设置同样控制着声明为"约束触发器"的触发器何时触发——它们在关联约束需要检查的同一时刻触发。

注解

由于数据库不要求约束名称在模式内唯一(仅要求在表内唯一),因此指定的约束名称可能存在多个匹配项。此时SET CONSTRAINTS将作用于所有匹配项。对于未限定模式的名称,一旦在搜索路径中的某个模式中找到匹配项,后续路径中的模式将不再被搜索。

此命令仅改变当前事务内约束的行为。在事务块外部执行此命令将发出警告,但不会产生任何效果。

兼容性

此命令符合SQL标准定义的行为规范,但存在以下限制:在数据库中,该命令不适用于NOT NULLCHECK约束。此外,数据库会立即检查不可延迟的唯一性约束,而非如标准建议的那样在语句执行结束时进行检查。