# 设置约束

SET CONSTRAINTS — 为当前事务设置约束检查时间

# 概要

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

# 描述

设置约束设置当前事务中约束检查的行为。即时在每个语句的末尾检查约束。延期直到事务提交才检查约束。每个约束都有自己的即时或者延期模式。

在创建时,约束被赋予以下三个特征之一:可延期的初始延期,最初立即可延期, 或者不可延期.第三课总是即时并且不受设置约束命令。前两个类以指示的模式启动每个事务,但它们的行为可以在事务中通过以下方式更改设置约束.

设置约束使用约束名称列表仅更改那些约束的模式(它们都必须是可延迟的)。每个约束名称都可以是模式限定的。如果未指定模式名称,则使用当前模式搜索路径查找第一个匹配的名称。全部设置约束更改所有可延迟约束的模式。

什么时候设置约束将约束的模式从延期即时,新模式追溯生效:在事务结束时检查的任何未完成的数据修改改为在执行期间检查设置约束命令。如果违反任何此类约束,则设置约束失败(并且不会更改约束模式)。因此,设置约束可用于强制检查约束发生在事务中的特定点。

目前,只有独特,首要的关键,参考(外键),和排除约束受此设置影响。非空查看插入或修改行时总是立即检查约束(不是在声明的末尾)。未声明的唯一性和排除性约束可延期的也立即进行检查。

声明为“约束触发器”的触发器的触发也受此设置控制——它们在应检查关联约束的同时触发。

# 笔记

因为 PostgreSQL 不要求约束名称在模式中是唯一的(但只要求每个表),所以指定的约束名称可能有多个匹配项。在这种情况下设置约束将对所有比赛采取行动。对于非模式限定名称,一旦在搜索路径中的某个模式中找到一个或多个匹配项,则不会搜索稍后出现在该路径中的模式。

此命令仅更改当前事务中约束的行为。在事务块之外发出这个会发出警告,否则无效。

# 兼容性

该命令符合 SQL 标准中定义的行为,除了限制,在 PostgreSQL 中,它不适用于非空查看约束。此外,PostgreSQL 会立即检查不可延迟的唯一性约束,而不是像标准建议的那样在语句结束时检查。