SET CONSTRAINTS
设置当前事务的约束检查时间。
Note: 引用完整性语法(外键约束)被接受但未强制执行。
概要
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
会更改那些约束的模式(必须全部推迟)。
每个约束名称可以是schema限定的。
如果未指定schema名称,则使用当前schema搜索路径查找第一个匹配名称。
SET CONSTRAINTS ALL
更改所有可延缓约束的模式。
当SET CONSTRAINTS
将约束的模式从DEFERRED
更改为IMMEDIATE
时,新模式将追溯生效:
在执行SET CONSTRAINTS
命令时,将检查在事务结束时会被检查的所有未完成的数据修改。
如果违反了任何此类约束,则SET CONSTRAINTS
会失败(并且不会更改约束模式)。
因此,SET CONSTRAINTS
可以用于强制检查约束以在事务的特定点发生。
当前,此设置仅影响UNIQUE
,PRIMARY KEY
,REFERENCES
(外键)和EXCLUDE
约束。
当插入或修改一行时(不在语句末尾),始终会立即检查NOT NULL
和CHECK
约束。
还可以立即检查尚未声明为DEFERRABLE
的唯一性和排除约束。
声明为“约束触发器”的触发器的触发也由此设置控制-它们在应检查相关约束的同时触发。
注解
因为Greenplum数据库不要求约束名称在schema中唯一(而仅按表),所以指定约束名称可能有多个匹配项。
在这种情况下,SET CONSTRAINTS
将对所有匹配起作用。
对于非schema限定的名称,一旦在搜索路径中的某些schema中找到一个或多个匹配项,就不会搜索路径中稍后出现的schema。
此命令仅更改当前事务中约束的行为。 在事务块外部发出此命令将发出警告,否则无效。
兼容性
该命令符合SQL标准中定义的行为,除了以下限制:在Greenplum数据库中,该命令不适用于NOT NULL
和CHECK
约束。
另外,Greenplum数据库会立即检查不可延展的唯一性约束,而不是像标准建议那样在声明结束时进行检查。
Parent topic: SQL Command Reference