Ограничение уникальности с диапазоном дат
-
29-09-2020 - |
Вопрос
Рассмотрим 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;