Задавайте вопросы, мы ответим
Вы не зашли.
Приветствую, коллеги!
Суть моей проблемы: есть таблица t в которой есть поле dt (datetime). Хотелось бы наложить такое ограничение (представим, что есть check constraint'ы , ну или можно же в mariadb функциональный индекс сделать ), чтобы нельзя было добавить (изменить) запись, в которой dt будет ближе чем, допустим, на 40 дней к любой другой записи.
То есть если у нас есть одна запись в таблице
id dt
1 2013-07-01
то можно добавить запись с dt='2013-05-05', но нельзя добавить с dt='2013-05-25'.
также можно добавить запись с dt='2013-08-25', но нельзя добавить с dt='2013-08-05'.
Если бы нужно было сделать уникальность в рамках месяца, года или дня - то уникальным функциональным индексом вопрос решился бы. А вот если уникальность в смысле отклонения определенного количества дней - не могу придумать как-то (. Решение в виде триггера, который будет пробегать по всей таблице и сравнивать разницу по модулю между каждым dt с 40 днями остаётся, но как-то это из пушки по воробьям, может проще можно как-то выкрутиться?
Поделитесь соображениями плиз.
Неактивен
Привет.
Если я все правельно понял, то можно так:
Создаем новую колонку time_step
Создаем составной уникальный индекс на (id,time_step)
Вычисляем time_step по формуле:
Отредактированно evgeny (20.04.2013 21:50:59)
Неактивен
Привет!
Спасибо за наводку. Только проблема в том, что предложенный тобой метод - он не обеспечивает уникальности в смысле "радиуса" числа - между первым и тридцатым мая разница меньше чем 40 дней, а предложенные запросы дают разные числа - 396 и 397.
То есть если сделать уникальный индекс на ceil((UNIX_TIMESTAMP(dt)/86416)/40), то СУБД не выругается на попытку вставить тридцатое мая 2013 при наличии уже имеющейся записи с 1-м мая 2013. Хотя должна - при моей постановке задачи.
Или я чего-то не учел?
Неактивен
Задача не похожа на формализуемый constraint. Видимо только триггером.
Неактивен
deadka написал:
Привет!
Спасибо за наводку. Только проблема в том, что предложенный тобой метод - он не обеспечивает уникальности в смысле "радиуса" числа - между первым и тридцатым мая разница меньше чем 40 дней, а предложенные запросы дают разные числа - 396 и 397.
То есть если сделать уникальный индекс на ceil((UNIX_TIMESTAMP(dt)/86416)/40), то СУБД не выругается на попытку вставить тридцатое мая 2013 при наличии уже имеющейся записи с 1-м мая 2013. Хотя должна - при моей постановке задачи.
Или я чего-то не учел?
Что то я действительно не то намутил :-)
Неактивен
evgeny написал:
Что то я действительно не то намутил :-)
Да не, просто предложенное тобой решение немножко другую задачу решает .
rgbeast написал:
Задача не похожа на формализуемый constraint. Видимо только триггером.
Похоже на то .
Спасибо!
Неактивен
Можно тригером так
Неактивен
Ага, что-то такое, спасибо ). На самом деле мне для postgresql надо ( как я писал вначале треда - представим, что у нас есть check constraint'ы, это жжж было неспроста ), но, конечно, было интересно, как задача решается "в общем" виде. В-общем виде, видимо, триггером как раз. В слоне, к слову, нашлась такая приятная штука как интервальный тип (для типа даты в том числе) и сопутствующие плюшки, видимо этим и воспользуюсь.
Никто не в курсе, к слову, может быть в MariaDB тоже планируются интервальные типы? В текущей версии не видел.
Неактивен