Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Проверка на наличие записи в таблице


Автор: alekspv 15.9.2014, 18:14
Здравствуйте. У меня такой вопрос как в таблице Oracle проверить наличие или отсуствие записи? Если запись не найдена, то её нужно вставить, иначе - обновить. Каким образом мне сделать такую проверку?

Автор: Zloxa 15.9.2014, 20:05
Если уникальность записи ограничивается схемой данных (первичный ключ или ограничение уникальности) - проверки выполнять не надо. Над пробовать вставить, если может вставиться, значит вставится, если нет - возникнет исключение, которое следует игнорировать. Это самый простой и надежный способ. Любые прочие способы либо не надежны, либо требуют каких-то дополнительных действий по блокированию ресурсов. Ведь между проверкой и вставкой может произойти вставка в другой сессии и вставка будет произведена при наличии зпаписи в табице.

Автор: LSD 2.10.2014, 15:28
Цитата(Zloxa @  15.9.2014,  21:05 Найти цитируемый пост)
Любые прочие способы либо не надежны, либо требуют каких-то дополнительных действий по блокированию ресурсов. Ведь между проверкой и вставкой может произойти вставка в другой сессии и вставка будет произведена при наличии зпаписи в табице.

А чем MERGE плох?

Автор: Zloxa 2.10.2014, 17:33
Цитата(LSD @ 2.10.2014,  16:28)
А чем MERGE плох?

тем же, чем проверка + вставка.

Сессия 1
Код

SQL> create table merge_test(id number primary key);
 
Table created
SQL> merge into merge_test t
  2    using (select 1 id from dual) s
  3    on (t.id = s.id)
  4    when not matched then insert values (s.id);
 
1 row merged


сессия 2
Код

SQL> merge into merge_test t
  2    using (select 1 id from dual) s
  3    on (t.id = s.id)
  4    when not matched then insert values (s.id);

встала на блокировке

сессия 1
Код

SQL> commit;
 
Commit complete


сессия 2
Код

ORA-00001: unique constraint (SMS.SYS_C0090006) violated
SQL> 


если бы не было ключа - в таблице оказалось бы две записи.

PS: А вобще да. Я наверное слишком много домыслил и дал ответ не на тот вопрос.  smile 

Автор: LSD 2.10.2014, 17:39
Цитата(Zloxa @  2.10.2014,  18:33 Найти цитируемый пост)
тем же, чем проверка + вставка.

Не понял, чем метод предлагаемый тобой:
Цитата(Zloxa @  15.9.2014,  21:05 Найти цитируемый пост)
Если уникальность записи ограничивается схемой данных (первичный ключ или ограничение уникальности) - проверки выполнять не надо. Над пробовать вставить, если может вставиться, значит вставится, если нет - возникнет исключение, которое следует игнорировать. Это самый простой и надежный способ.

лучше? Он точно так же встанет на блокировке.

Автор: Zloxa 2.10.2014, 17:46
LSD, я походу дал ответ не на тот вопрос. ТС ничего не говорит о конкуренции, а  я, походу, пропустил что ему нужно апдейтиться. Почему-то полагал что ему нужно просто вставиться, причем в табличку без констрейнта. С какого вдруг бадуна меня так занесло - хз. Вероятность что ТС будет полезен овтет "MERGE", пожалуй куда выше, чем то, о чем подумал я.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)