2009-11-05 26 views
0

比方说,我们有这个定义的表:如何在PosgreSQL数据库中声明范围重叠约束?

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) 
) 

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

回答

1

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

一些解决方案:

  • 与表强制插入的系列化明确锁定使用手续。
  • 将[from,to]范围拆分为[from,from + 1,...,to-1,to]并插入一行。这样,您可以在“范围”表上使用简单的唯一索引。在PostgreSQL的8.5

PostgreSQL的开发者杰夫·戴维斯has been writingabout this lately并将实施范围冲突的限制

0

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

1

没有标准的“重叠”约束。你将不得不从一些触发器构建你自己的。尽管8.5已经讨论过这个问题。

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