回答:
はい、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
、同じを持つ2つの行を許可しないquantity
、重複する(&&
)日付範囲。
の '[]'
は、必要なすべてを含む日付範囲[)
用です(デフォルトは範囲タイプ用です)。
範囲タイプの制約に関するドキュメントを参照してください。(おそらく、これをインストールするデータベースごとに)を実行して、拡張機能を追加する必要があります。
CREATE EXTENSION btree_gist;
(product_id, start_date)
。日付範囲では、それは上のインデックスでなければならない(product_id, lower(range_column))
daterange
は思いませんが、それは簡単に修正できます。列タイプを使用するようにデータを実際に移行する必要がありますか(それが良い場合は別の質問にすることができます)、またはこの2列のことは合理的ですか?daterange