Postgresql 中文操作指南
Description
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 约束(在语句末尾检查 not )。没有声明为 DEFERRABLE 的唯一性约束和排他约束也立即进行检查。
声明为“约束触发器”的触发器的触发也受此设置控制 — 约束应在触发器触发同时进行检查。