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

时间:2009-11-05 13:10:53

标签: 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),
  smellId int references smell(id),
  CONSTRAINT item_colour_smell_unique UNIQUE (colour, smell, id)
)

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

3 个答案:

答案 0 :(得分:2)

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

一些解决方案:

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

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

答案 1 :(得分:1)

没有标准的“重叠”约束。你必须从一些触发器构建自己的。尽管如此,已经讨论过8.5。

您可能会发现“seg”模块也很有用。参见手册 - 附录F.附加提供的模块

答案 2 :(得分:0)

这并不能完全给你答案,但听起来你可能想要使用触发器。