阅读(3600) (21)

PostgreSQL SET CONSTRAINTS

2021-08-23 15:46:50 更新

SET CONSTRAINTS — 为当前事务设置约束检查时机

大纲

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

描述

SET CONSTRAINTS设置当前事务内约束检查 的行为。IMMEDIATE约束在每个语句结束时被检查。 DEFERRED约束直到事务提交时才被检查。每个约束都有 自己的IMMEDIATEDEFERRED模式。

在创建时,一个约束会被给定三种特性之一: 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可以被用来在一个事务中的特定点强制进 行约束检查。

当前,只有UNIQUEPRIMARY KEYREFERENCES(外键)以及EXCLUDE 约束受到这个设置的影响。 NOT NULL以及CHECK约束总是在一行 被插入或修改时立即检查(不是在语句结束时)。 没有被声明为DEFERRABLE的唯一和排除约束也会被 立刻检查。

被声明为约束触发器的触发器的引发也受到这个设置 的控制 — 它们会在相关约束被检查的同时被引发。

注解

因为PostgreSQL并不要求约束名称在模式内 唯一(但是在表内要求唯一),可能有多于一个约束匹配指定的约束名称。在这种 情况下SET CONSTRAINTS将会在所有的匹配上操作。 对于一个非模式限定的名称,一旦在搜索路径中的某个模式中发现一个或者多个匹 配,路径中后面的模式将不会被搜索。

这个命令只修改当前事务内约束的行为。在事务块外部发出这个命令会产生一个 警告并且也不会有任何效果。

兼容性

这个命令符合 SQL 标准中定义的行为,但有一点限制:在 PostgreSQL中,它不会应用在 NOT NULLCHECK约束上。还有, PostgreSQL会立刻检查非可延迟的 唯一约束,而不是按照标准建议的在语句结束时检查。