powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти)))
18 сообщений из 43, страница 2 из 2
Да же не знаю как к єтому подойти)))
    #34831308
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_Многоверсионных СУБД (например IB) проверять, например на уникальность, мягко говоря, не рекомендуется. В Informix'e, видимо благодаря блокировке можно. Так ли это?В версионниках надо отдельно извращаться, т.к. две одновременных транзакции не видят данных друг друга, то проверка просто не сработает, и в бд будут неконстистентные данные (пересекающиеся периоды).
В блокировочнике попроще "опоздавшая" транзакция "зависнет" и проверит уже закомиченное.

Gold_Как написать в чекконстраинте, например условие: (new_date_begin between date_begin and date_end)
не знаю. В документации не нашел. Видимо плохо искал (. Подскажите как?Никак. Я когда ранее писал про check думал про вариант проверки самосоединением таблицы, но этот вариант во первых медленнее, во вторых информикс не позволяет делать селект из check констрейнта (я ошибочно думал что позволяет). Триггером надо проверять.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34831430
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис ..Триггером надо проверять.
Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре?
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34831928
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_ Журавлев Денис ..Триггером надо проверять.
Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре?
Если в процедуре сделать сначала insert/update, а потом проверить а не противоречат-ли другие записи, то наверно получится.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34832458
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис Gold_ Журавлев Денис ..Триггером надо проверять.
Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре?
Если в процедуре сделать сначала insert/update, а потом проверить а не противоречат-ли другие записи, то наверно получится.
Ага... и если противоречит откатываю транзакцию.
А если наоборот (как я хотел), то между проверкой и insert/update может быть другой insert/update
Так?
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34833324
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_Ага... и если противоречит откатываю транзакцию.Да.
Gold_А если наоборот (как я хотел), то между проверкой и insert/update может быть другой insert/update
Так?Именно.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34835744
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев ДенисДа, забыл. Предлагаю так:
(new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end)
or (new_date_begin < date_begin and new_date_end > date_end)


все таки видимо так:
((new_date_begin >= date_begin) and (new_date_begin < date_end))
or ((new_date_end > date_begin) and (new_date_end <=date_end)
or ((date_begin >= new_date_begin) and (date_begin < new_date_end))
or ((date_end > new_date_begin) and (date_end <=new_date_end)

начал путаться.. поправте

Перемудрили.

Для условия пересечения интервалоа достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836068
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkubr
Для условия пересечения интервалоа достаточно написать так ( учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999 ):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin



тогда недостаточно ограничения на входные параметры по отсутствию NULL
необходимо ЕЩЁ одно ограничение на входные параметры:

Код: plaintext
new_date_begin >= new_date_end
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836072
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛой
сорри, конечно же
new_date_begin <= new_date_end
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836074
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, конечно же
new_date_begin <= new_date_end


П.С.: срочно спать!
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34836236
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛой
тогда недостаточно ограничения на входные параметры по отсутствию NULL
необходимо ЕЩЁ одно ограничение на входные параметры:
Код: plaintext
new_date_begin >= new_date_end

Разумеется, это подразумевалось.

Условие (beg <= end) реализуется отдельно через check constraint.

Т.о. в условие пересечения/непересечения интервалов (реализуется через триггер)
его можно не включать.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34837980
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkubr[quot ]
....

Перемудрили.

Для условия пересечения интервалоа достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin
Переупростил )
Например, "новый интервал" вписывается между "старыми"..
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838159
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold_ vkubr[quot ]
....

Перемудрили.

Для условия пересечения интервалов достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999):

new_date_begin <= date_end AND new_date_end >= date_begin

Условие непересечения интервалов:

new_date_begin > date_end OR new_date_end < date_begin
Переупростил )
Например, "новый интервал" вписывается между "старыми"..

Что значит "новый интервал" вписывается между "старыми" ? Причем тут попарное непересечение интервалов? Может мы о разных вещах говорим?

Указанные условия пересечения (непересечения) интервалов предназначены для использования в ситуации, когда есть таблица, реализующая т.н. "интервальную" историю и требуется обеспечить попарное непересечение интервалов.

Предположим, что интервал задается парой колонок date_beg и date_end:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE History(
...
  date_beg DATE NOT NULL,
  date_end DATE NOT NULL,
...
  CHECK( date_beg<=date_end ),   // Гаранируем корректность интервала.
...
);
Если требуется, то для обозначения "минус-бесконечности" и "плюс-бесконечности" используем, соответственно, 01.01.0001 и 31.12.9999.

Теперь остается обеспечить, чтобы все интервалы попарно не пересекались.

Для этого создаем INSERT/UPDATE-триггеры, в которых для вставляемой/редактируемой записи проверяем, что для вновь устанавливаемых значений new.date_beg и new.date_end в таблице не существует других интервалов, пересекающихся с устанавливаемым.

То есть в триггере пытаемся найти пересекающийся интервал, и если таковой обнаруживается, то делаем EXCEPTION.
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TRIGGER History_i
     INSERT ON History REFERENCING NEW new FOR EACH ROW
  WHEN( ( SELECT COUNT(*) 
            FROM History
           WHERE new.date_beg <= History.date_end AND 
                 new.date_end >= History.date_beg ) >  1  )
  ( RAISE EXCEPTION - 746  ) );

Аналогично - для UPDATE.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838432
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkubrВы проверяйте что-ли то что пишете. С таким триггером вообще в таблицу ничего не вставить.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select * from test_d  
start_date end_date 
 01 . 01 . 07     01 . 02 . 07 

select count(*) from test_d where '01.01.2007'<=start_date and '01.02.2007'>=end_date
      (count(*)) 
                1 

И вообще
Код: plaintext
1.
2.
select count(*) from test_d where '01.01.2006'<=start_date and '15.01.2007'>=end_date "| dbaccess a
      (count(*)) 
                0 
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838455
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, это я даты наоборот поставил.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838514
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Журавлев Денис vkubrВы проверяйте что-ли то что пишете. С таким триггером вообще в таблицу ничего не вставить.
А Вы попробуйте. Только с тем запросом, который в триггере, а не с тем, который в Вашем посте (у Вас совсем другое условие).

Условие (SELECT COUNT(*) ... ) > 1 (а не " > 0 ", как можно было бы подумать) учитывает, что в выборку попадет и сам вставляемый интервал, т.к. интервал всегда пересекается с самим собой.

Конечно, если делать реализацию не через триггер, а через процедуру, используемую вместо INSERT/UPDATE и выполняющую проверку до вставки/редактирования, то условие должно быть " > 0 ").

Но делать через триггер -- надежнее.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838613
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkubr


Вы правы.
Спасибо.
Я кроме прочих неточностей еще и предполагал, что например периоды
2007-10-10 12:00:00 - 2007-10-10 13:00:00
и
2007-10-10 13:00:00 - 2007-10-10 14:00:00
не пересекаются...
Пользователю, так удобно видеть..
надо бы решить принципиально что у меня включено в период, а что исключено
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838670
vkubr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gold_
Я кроме прочих неточностей еще и предполагал, что например периоды
2007-10-10 12:00:00 - 2007-10-10 13:00:00
и
2007-10-10 13:00:00 - 2007-10-10 14:00:00
не пересекаются...
Пользователю, так удобно видеть..
надо бы решить принципиально что у меня включено в период, а что исключено
В этом случае нужно просто договориться, что правая граница интервала в него не входит и соответствующим образом скорректировать условия: в условии пересечения интервалов поменять нестрогие сравнения ( >= и <= ) на строгие ( > и < ), а в условии непересечения -- наоборот.
...
Рейтинг: 0 / 0
Да же не знаю как к єтому подойти)))
    #34838706
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkubr
Условие (SELECT COUNT(*) ... ) > 1 (а не " > 0 ", как можно было бы подумать) учитывает, что в выборку попадет и сам вставляемый интервал, т.к. интервал всегда пересекается с самим собой.Да, уже сообразил.


vkubrКонечно, если делать реализацию не через триггер, а через процедуру, используемую вместо INSERT/UPDATE и выполняющую проверку до вставки/редактирования, то условие должно быть " > 0 ").До вставки/редактирования как раз проверять нельзя, одновременно навставляют из разных транзакций.

vkubrНо делать через триггер -- надежнее.Без разницы, если правильно все сделать.
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / Informix [игнор отключен] [закрыт для гостей] / Да же не знаю как к єтому подойти)))
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]