Доброе время суток!
Коллеги, помогите найти решение:
Есть таблица с полями:
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
Решается примерно так
Для этой задачи нужно
Для этой задачи нужно использовать exclusion constraints.
Пример можно посмотреть, например здесь:
http://www.slideshare.net/pgconf/not-just-unique-exclusion-constraints