假设我们有一个包含这个定义的表格:
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
的重叠。
答案 0 :(得分:2)
请注意,任何基于触发器的解决方案在竞争条件下都具有固有的不安全性,例如:当两个并发事务插入一个冲突范围的行时,由于“隔离”ACID属性(只能看到提交的数据),它们都不会看到另一个冲突的行。
一些解决方案:
PostgreSQL开发人员Jeff Davis has been writing about this lately并将在PostgreSQL 8.5中实现范围冲突约束
答案 1 :(得分:1)
没有标准的“重叠”约束。你必须从一些触发器构建自己的。尽管如此,已经讨论过8.5。
您可能会发现“seg”模块也很有用。参见手册 - 附录F.附加提供的模块
答案 2 :(得分:0)
这并不能完全给你答案,但听起来你可能想要使用触发器。