本文介绍了SET CONSTRAINTS的语法及相关说明。
简介
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
的唯一和排除约束也会被立刻检查。
被声明为“约束触发器”的触发器的引发也受到这个设置的控制 — 它们会在相关约束被检查的同时被引发。
语法
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
说明
因为PolarDB并不要求约束名称在模式内唯一(但是在表内要求唯一),可能有多于一个约束匹配指定的约束名称。在这种情况下SET CONSTRAINTS
将会在所有的匹配上操作。 对于一个非模式限定的名称,一旦在搜索路径中的某个模式中发现一个或者多个匹配,路径中后面的模式将不会被搜索。
这个命令只修改当前事务内约束的行为。在事务块外部发出这个命令会产生一个警告并且也不会有任何效果。