Вопрос

Рассмотрим 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top