是否可以在 PostgreSQL 中创建唯一索引或其他类型的约束,这将在事务 COMMIT 上进行检查,而不是提前一毫秒?
我需要一对 (record_id, ordering) 的索引,因此我确保在给定的 record_id 中只有一个且不超过一个记录具有相同的顺序。问题出在哪里?好吧,问题在于我使用的 Web 框架处理重新排序项目的方式。看起来,当移动一个项目时,当其排序顺序发生更改时,框架会使用新的排序值写入新项目,然后不久之后它会更新另一个项目,从而创建一种临时情况,其中多个记录具有相同的订购值。重新排序所有内容后,所有记录都会更新,并且在事务提交时,一切都应该再次正常。
如果重要的话,我正在使用 PostgreSQL 10。
Use 设定限制命令:
设定限制
SET CONSTRAINTS — 设置当前事务的约束检查时间
Synopsis
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }
描述
SET CONSTRAINTS 设置当前事务中约束检查的行为。直接约束是
在每个语句的末尾进行检查。 DEFERRED 约束不是
检查直到事务提交。每个约束都有自己的
立即或延迟模式。
创建时,约束被赋予以下三个特征之一:
可延迟初始延迟、可延迟初始立即或不可
可延期。第三类始终是 IMMEDIATE 并且不受
设置约束命令。前两节课每
以指定模式进行交易,但其行为可以更改
在事务内通过 SET CONSTRAINTS。
带有约束名称列表的 SET CONSTRAINTS 会更改
只是这些约束(都必须是可推迟的)。每个约束
名称可以是模式限定的。使用当前架构搜索路径
如果未指定模式名称,则查找第一个匹配的名称。放
CONSTRAINTS ALL 更改所有可延迟约束的模式。
当 SET CONSTRAINTS 将约束模式从 DEFERRED 更改为
新模式立即追溯生效:任何未完成的
数据修改将在结束时检查
相反,交易是在 SET 执行期间检查的
约束命令。如果违反任何此类约束,则 SET
CONSTRAINTS 失败(并且不会更改约束模式)。因此,设置
CONSTRAINTS 可用于强制检查约束发生在
交易中的特定点。
目前,只有 UNIQUE、PRIMARY KEY、REFERENCES(外键)和
EXCLUDE 约束受此设置的影响。 NOT NULL 并检查
插入行或插入行时总是立即检查约束
修改(不在声明末尾)。独特性和排他性
还检查尚未声明 DEFERRABLE 的约束
立即地。
声明为“约束触发器”的触发器的触发是
也受此设置控制——它们在
应检查相关约束。
您还可以在(例如)的参考文档中找到创建表
[ 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 ]
约束可以是:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)