Answers:
是的,您可以使用EXCLUDE
约束,它是UNIQUE
约束的概括:
ALTER TABLE prices
ADD CONSTRAINT unique_price_per_product_quantity_daterange
EXCLUDE USING gist
( product_id WITH =,
quantity WITH =,
daterange(start_date, end_date, '[]') WITH && -- this is the crucial
);
约束可以解释为:
不允许两行具有相同
product_id
,相同quantity
和重叠(&&
)日期范围。
该'[]'
是为希望全包的日期范围(默认是[)
用于范围类型)。
请参阅有关范围类型约束的文档。您可能还需要通过运行添加扩展名(一次,对于要安装此扩展名的每个数据库):
CREATE EXTENSION btree_gist;
(product_id, start_date)
。随着日期范围,将必须要对一个指标(product_id, lower(range_column))
daterange
是完全相同的,因为它是排他的下限,但这很容易解决。我是否应该真正地将数据迁移为使用daterange
列类型(如果更好,可以单独提出一个问题),或者这两个列的内容是否合理?