Postgresql
日期範圍的唯一性約束
考慮一個
prices
包含這些列的表:id integer primary key product_id integer -- foreign key start_date date not null end_date date not null quantity integer price numeric
我希望數據庫強制執行規則,即產品只能在日期範圍內(通過
where <date> BETWEEN start_date AND end_date
)具有特定數量的一個價格。這種基於範圍的約束可行嗎?
是的,您可以使用
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;