如何在PostgreSQL数据库中声明范围重叠约束?
假设我们有一个定义如下的表:如何在PostgreSQL数据库中声明范围重叠约束?,postgresql,constraints,range,unique,Postgresql,Constraints,Range,Unique,假设我们有一个定义如下的表: range ( id bigint primary key, colourId int references colour(id), smellId int references smell(id), from bigint, to bigint ) 这张桌子实际上是一张大大的桌子的缩小视图: item ( id bigint primary key, colourId int references colour(id), smel
range (
id bigint primary key,
colourId int references colour(id),
smellId int references smell(id),
from bigint,
to bigint
)
这张桌子实际上是一张大大的桌子的缩小视图:
item (
id bigint primary key,
colourId int references colour(id),
smellId int references smell(id),
CONSTRAINT item_colour_smell_unique UNIQUE (colour, smell, id)
)
我想翻译范围表中的项目\颜色\气味\唯一约束。它应该注意范围[从,到]的重叠同时考虑colorID和someID列值。这并不能完全给出答案,但听起来您可能需要使用触发器。这并不能完全给出答案,但听起来您可能需要使用触发器。没有标准的重叠约束。您必须从一些触发器构建自己的触发器。不过,8.5版中已经讨论过这一点
您可能会发现seg模块也很有用。参见手册-附录F。附加提供的模块没有标准重叠约束。您必须从一些触发器构建自己的触发器。不过,8.5版中已经讨论过这一点
您可能会发现seg模块也很有用。请参阅手册-附录F。其他提供的模块注意,任何基于触发器的解决方案在竞争条件下本质上都是不安全的,例如,当两个并发事务插入具有冲突范围的行时,它们都不会看到另一个冲突行,因为隔离ACID属性只能看到提交的数据 一些解决方案: 使用表显式锁定的过程强制插入序列化。 将[from,to]范围拆分为[from,from+1,…,to-1,to],并为每个范围插入一行。这样,您就可以在范围表上使用一个简单的唯一索引。
PostgreSQL开发人员Jeff Davis将在PostgreSQL 8.5中实施范围冲突约束请注意,任何基于触发器的解决方案在竞争条件下都是不安全的,例如,当两个并发事务插入一个范围冲突的行时,它们都不会看到另一个冲突行,由于隔离酸属性,只能看到提交的数据 一些解决方案: 使用表显式锁定的过程强制插入序列化。 将[from,to]范围拆分为[from,from+1,…,to-1,to],并为每个范围插入一行。这样,您就可以在范围表上使用一个简单的唯一索引。
PostgreSQL开发人员Jeff Davis将在PostgreSQL 8.5中实现范围冲突约束添加了范围冲突约束,请参见添加了范围冲突约束,请参见