Postgresql

日期範圍的唯一性約束

  • June 1, 2016

考慮一個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;

引用自:https://dba.stackexchange.com/questions/110582