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 可以用于强制在事务中某一点进行约束检查。

在你把约束的模式修改成 IMMEDIATE 之后,新的约束模式是反作用式地生效的: 任何尚在等待的,需要在事务结束检查地数据修改的约束(在使用 DEFERRED 的时候)都将在执行 SET CONSTRAINTS 命令的时候马上检查。

目前,只有外键约束被这个设置影响。检查和唯一约束总是不可推迟的。

注意

这个命令只在当前事务里修改约束的行为。因此,如果你在事务块外面 (BEGIN/COMMIT 对)执行这个命令, 它将显得没有任何作用那样。

兼容性

这条命令与 SQL 标准里定义的行为兼容,只不过,在 PostgreSQL 里,它只适用于外键约束。

SQL 标准说在 SET CONSTRAINTS 里出现的约束名可以用模式修饰。 这个在 PostgreSQL 里还不支持:名字必须是无修饰的, 并且所有匹配命令的约束都将被影响,不管它在哪个模式里。