SET CONSTRAINTS

Name

SET CONSTRAINTS -- 设置当前事务的约束检查模式

Synopsis

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

描述

SET CONSTRAINTS 设置当前事务里的约束检查的特性。 IMMEDIATE 约束是在每条语句后面进行检查的。 DEFERRED 约束一直到事务提交时才检查。 每个约束都有自己的 IMMEDIATE 或者 DEFERRED 模式。

从创建的时候开始,一个约束总是给定为下面三个特性之一: DEFERRABLE INITIALLY DEFERREDDEFERRABLE 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 里还不支持:名字必须是无修饰的, 并且所有匹配命令的约束都将被影响,不管它在哪个模式里。