Создать ограничение по датам начало-конец, чтобы записи не имели пересечений
Как можно создать ограничение на уровне РСУБД MySQL или Postgresql, чтобы записи одного и того же типа (type) не могли пересекаться по интервалу дат начало-конец?
Например, есть запись с типом type = uri_1 и интервалом publish_up .. publish_down равным 2020-08-10 00:00:00 .. 2020-08-20 00:00:00. Ограничение должно запрещать вставку записи с тем же типом и пересечением интервала, например это будет 2020-08-15 00:00:00 .. 2020-08-30 00:00:00. Но аналогичная запись с type = uri_2 вставляться должна.
Интересует решение для любой РСУБД: MySQL или Postgresql
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
В postgresql можно воспользоваться ограничениями-исключениями (exclusion constraints):
CREATE EXTENSION IF NOT EXISTS btree_gist;
CREATE TABLE intervals (
type text,
publish_up timestamp,
publish_down timestamp,
EXCLUDE USING GIST (type WITH =, tsrange(publish_up, publish_down) WITH &&)
);