Postgres: уникальное ограничение целочисленного диапазона - PullRequest
1 голос
/ 13 июля 2020

Учитывая два целых числа, начало и конец, и внешний ключ, как мне определить ограничение unique для интервала start: end включительно и foreign_key

Учитывая, что у меня есть следующие записи в моем table:

+-------+-----+--------------------------------------+
| start | end | foreign_key                          |
+-------+-----+--------------------------------------+
| 10    | 20  | 04ef8258-917c-46d6-8db3-9c704d3f4fbd |
+-------+-----+--------------------------------------+
| 40    | 60  | 04ef8258-917c-46d6-8db3-9c704d3f4fbd |
+-------+-----+--------------------------------------+

Затем следующие вставки должны завершиться неудачно:

+-------+-----+--------------------------------------+
| start | end | foreign_key                          |
+-------+-----+--------------------------------------+
| 30    | 50  | 04ef8258-917c-46d6-8db3-9c704d3f4fbd |
+-------+-----+--------------------------------------+
| 12    | 18  | 04ef8258-917c-46d6-8db3-9c704d3f4fbd |
+-------+-----+--------------------------------------+

То, что я пробовал до сих пор:

alter table some_table
  add constraint unique_interval_to_foreign_key_constraint
    unique (start, end, foreign_key)

Это не работает, так как определяет только уникальное ограничение для дискретных точек и внешнего ключа, а не диапазон.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 13 июля 2020

Добавляем ответ для полноты:

CREATE EXTENSION btree_gist;

ALTER TABLE some_table
    ADD CONSTRAINT unique_interval_to_foreign_key_constraint
        EXCLUDE USING gist
        (foreign_key WITH =,
         int4range(start, end, '[]') WITH &&
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...