Как обеспечить ввод данных с не перекрывающимися временными интервалами?

голоса
1

Мне нужно убедиться, что моя база данных содержит только те записи, в которых два или более столбцов уникальны. Этого легко добиться с помощью UNIQUEограничений по этим столбцам.

В моем случае, я должен запретить дублирование только для перекрытия временных диапазонов. В таблице есть valid_fromи valid_toстолбцы. В некоторых случаях может понадобиться сначала завершить активную запись, установивvalid_to = now, а затем вставить новую запись, настроенную на valid_from = nowи valid_to = infinity.

Я, кажется, в состоянии истечения срока действия предыдущей записи без каких-либо проблем с использованием UPDATE, но вставка новой записи кажется проблематичным, так как мои базовые столбцы в настоящее UNIQUEвремя, и поэтому не может быть добавлен снова

Я подумал о том, чтобы добавить valid_fromи valid_toкак часть UNIQUEограничения, но это только сделало бы ограничение более свободным и позволило бы дублирует и перекрывает временные диапазоны, чтобы существовать.

Задан 10/05/2020 в 19:31
источник пользователем
На других языках...                            


1 ответов

голоса
0

Ты был на правильном пути. Но синтаксис ограничений по исключению немного отличается:

CREATE TABLE registration  (
  tbl_id  integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a   integer NOT NULL
, col_b   integer NOT NULL
, valid_from timestamptz
, valid_to   timestamptz
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tstzrange(valid_from, valid_to) WITH &&)
);

Возможно, btree_gistсначала вам понадобится установить дополнительный модуль, в зависимости от определения нераскрытой таблицы.

Каждый столбец должен быть перечислен с соответствующим оператором.

И вам нужен тип диапазона. Предположимtimestamp with time zone, что и для, valid_fromи valid_toдля выражения tstzrange(valid_from, valid_to)это сработает.

Связанный:


Может быть, превосходный дизайн - это соотношение "один-ко-многим" между вашим registrationстолом и 1-N записями в новом registration_rangeстоле. И некоторая логика для определения текущей действительной записи (для любого заданного момента времени). Зависит от более нераскрытой информации.


Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more