SET CONSTRAINTS
Name
SET CONSTRAINTS -- 设置当前事务的约束检查模式
Synopsis
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
将作用于所有的匹配。对于一个无模式限定的名称, 一旦一个或多个匹配在搜索路径下的相同模式中被找到,路径中晚出现的模式不会被搜索。
这个命令只在当前事务里修改约束的行为。因此,如果你在事务块之外 (BEGIN
/COMMIT
对)执行这个命令,它将没有任何作用。
兼容性
这条命令与 SQL 标准里定义的行为兼容,只不过,在PostgreSQL里, 它不适用于NOT NULL
和 CHECK
约束。还有,PostgreSQL 立即检查不可推延的唯一性约束,不是像标准建议的那样在语句末检查。