PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# SET CONSTRAINTS

## 名称

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 立即检查不可推延的唯一性约束，不是像标准建议的那样在语句末检查。

上一页 | 起始页 | 下一页
SET | 上一级 | SET ROLE