PostgreSQL约束,该约束将在COMPL上检查而不是更早



是否可以创建在PostgreSQL中创建唯一的索引或其他类型的约束,这将在事务提交中检查而不是更早的毫秒?

我需要一对(record_id,ordering(的索引,因此我确保在给定的record_id中只有一个和不超过一个记录具有相同的订购。问题在哪里?好吧,问题在于我正在使用的Web框架重新排序项目的方式。看起来,当一个项目移动时,当更改排序订购时,该框架以新的订购值编写新项目,然后不久之后,它会更新另一个,从而创建了一个临时情况,其中一个以上的记录具有相同的排序值。重新订购所有内容后,所有记录都将更新,并在交易上提交所有记录,一切都应该再次很好。

如果这很重要,我正在使用PostgreSQL 10。

使用set jondraints命令:

设置约束

设置约束 - 设置约束检查当前事务的时机

概要

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

描述

设置约束设置当前交易中约束检查的行为。即时约束 在每个语句的末尾检查。递延约束不是 检查直到交易提交。每个约束都有自己的 立即或递延模式。

创建后,限制了三个特征之一: 最初延期延期,延期延迟,最初是立即的 延期。三等班总是直接的,不受 设置约束命令。前两个类别开始 在指示模式下的交易,但可以更改其行为 在交易中通过设置约束。

设置约束名称列表的约束更改的模式 只是这些约束(必须延迟所有的约束(。每个约束 名称可以合格。当前的模式搜索路径已使用 如果未指定架构名称,则查找第一个匹配名称。放 约束所有都会改变所有可推迟约束的模式。

设置约束时,将约束的模式从递延到 立即,新模式会追溯生效:任何未偿还的 将在结束时检查的数据修改 相反,在执行集合期间检查交易 约束命令。如果违反了任何这样的约束,该集合 约束失败(并且不会更改约束模式(。因此,设置 约束可以用来强制检查约束的发生 交易中的特定点。

当前,只有唯一的,主要密钥,参考(外键(和 排除约束受此设置的影响。不为空检查 插入行或 修改(不是在说明结尾(。独特性和排斥 还检查了尚未声明的延期的约束条件。 立即。

被声明为"约束触发器"的触发器的触发是 也由这种设置控制 - 他们同时开火 应检查关联的约束。


您还可以在(例如(创建表

的参考文档中找到
[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  CHECK ( expression ) [ NO INHERIT ] |
  DEFAULT default_expr |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
  UNIQUE index_parameters |
  PRIMARY KEY index_parameters |
  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

约束可以是:

  • 最初推迟|最初立即
  • 延期|不推迟

最新更新