gpt4 book ai didi

postgresql - 如何在 PostgreSQL 数据库中声明范围重叠约束?

转载 作者:行者123 更新时间:2023-11-29 12:39:17 25 4
gpt4 key购买 nike

假设我们有一个定义如下的表:

range (
id bigint primary key,
colourId int references colour(id),
smellId int references smell(id),
from bigint,
to bigint
)

这个表实际上是一个非常大的表的缩减 View :

item (
id bigint primary key,
colourId int references colour(id),
smellId int references smell(id),
CONSTRAINT item_colour_smell_unique UNIQUE (colour, smell, id)
)

我想翻译 range 表中的 item_colour_smell_unique 约束。它应该观察 [from, to] 范围的重叠,同时考虑 colourIdsmellId 列值。

最佳答案

请注意,任何基于触发器的解决方案本质上都是不安全的,不受竞争条件的影响,例如当两个并发事务插入一个范围冲突的行时,由于“隔离”ACID 属性(只能看到提交的数据),它们都不会看到另一个冲突的行。

一些解决方案:

  • 使用显式锁定表的过程来强制序列化插入。
  • 将 [from, to] 范围拆分为 [from, from+1, ..., to-1, to] 并为每个范围插入一行。这样您就可以在“范围”表上使用一个简单的 UNIQUE INDEX。

PostgreSQL 开发人员 Jeff Davis has been writing about this lately并将在 PostgreSQL 8.5 中实现范围冲突约束

关于postgresql - 如何在 PostgreSQL 数据库中声明范围重叠约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1680465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com