создание сложного CONSTRAINT

Доброе время суток!
Коллеги, помогите найти решение:
Есть таблица с полями:
date_begin: date
date_end: date
data1: str
data2: str
etc.

Задача в том, что бы создать такой CONSTRAINT, который не позволит создать новые строки данных либо поменять уже существующие таким образом, что бы пересекались периоды строк, заданные полями date_begin:date_end.

Опции просмотра комментариев

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

Вроде всё доступно

Вроде всё доступно написано:
http://postgresql.ru.net/manual/ddl-constraints.html#AEN2554

спасибо 

спасибо :)

гм, на самом деле из того,

гм, на самом деле из того, что здесь написано можно сделать вывод, что такое реализовать не возможно. Или я ошибаюсь?
есть две строки (поля date_begin; date_end):
строка_1: 01.03.2015; 20.03.2015
строка_2: 15.03.2015; 25.03.2015
Периоды, заданные данными строками пересекаются. По указанной ссылке я не нашел решения для данной задачи. Вообще, есть ли оно, это решение?

Ограничение целостности

Ограничение целостности действует только на информацию в одной строке таблицы.
Если вы хотите реализовать ограничение, которое учитывает данные других строк таблицы, тогда вам нужно делать триггер и анализировать всю нужную информацию в таблице при вставке или обновлении новой записи.
Как можно понять - это очень плохой подход, потому что при сколь-нибудь большом количестве записей в таблице, тормоза будут жууууткие! Подумайте, может быть возможно как-то изменить структуру БД, чтобы всё было не так сложно и затратно?

Спасибо за комментарии и

Спасибо за комментарии и помощь в решении задачи. Такую структуру бд я принял взамен структуры mdate, data1, data2, где mdate -unique. Суть в том, что данные в таблице обновляются ежедневно, но меняются они довольно редко. Поэтому взятая мною структура позволяет в десятки раз сократить количество строк (за счет обновления поля end_date вместо создания новой строки). Это может быть существенно, если размеры таблицы будут составлять миллионы строк. В общем, остается одно - построить такую логику добавления/обновления данных в таблице, что бы исключить возможность появления подобных строк.

Решается примерно так SELECT

Решается примерно так

SELECT d.fromdate,
             d.tilldate,
             CASE WHEN (LEAST(d.fromdate, :Fromdate) <= GREATEST(d.tilldate, :Tilldate)
                                 ) AND
                                (GREATEST(d.fromdate, :Fromdate) >= LEAST(d.tilldate, :Tilldate)
                                ) AND
                                NOT (d.fromdate = :Fromdate OR d.tilldate = :Tilldate) AND 
                                 d.fromdate > nvl(LAG(d.tilldate) OVER (ORDER BY d.fromdate), d.fromdate -1)
                      THEN 0
              ELSE 1
              END Intersection
FROM date_table d

Для этой задачи нужно

Для этой задачи нужно использовать exclusion constraints.
Пример можно посмотреть, например здесь:
http://www.slideshare.net/pgconf/not-just-unique-exclusion-constraints

Опции просмотра комментариев

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

Back to top

(С) Виктор Вислобоков, 2008-2023