如何在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中实现范围冲突约束

添加了范围冲突约束,请参见添加了范围冲突约束,请参见