powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / IF EXISTS UPDATE ELSE INSERT
24 сообщений из 24, страница 1 из 1
IF EXISTS UPDATE ELSE INSERT
    #38380628
bubuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как разруливаются такие ситуации. Если у нас есть определённая запись в табличке - мы её меняем, если нету, вставляем(IF EXISTS UPDATE ELSE INSERT). Причём в UPDATE мы меняем флаг, а в INSERT вставляем ГИГАБАЙТ, потому желательно делать это разными запросами. Табличку могут менять разные процессы.
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38380709
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ответ на вопрос специфичен для конкретной СУБД
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38380726
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если Вы в Insert вставляете гигабайт - то вряд ли таких вставок у Вас сотня в секунду?
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38380756
bubuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
субд - MsSql
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38380775
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bubuzuсубд - MsSqlMERGE, если это одна и та же таблица и версия >= 2008.
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38380909
bubuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor TiegaelMERGE, если это одна и та же таблица и версия >= 2008.
А что делать с ГИГАБАЙТом, не тащить же его в каждый запрос.
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38380956
bubuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно попробовать сделать update, если не получится, то запустить MERGE

try
{
UPDATE
}
catch
{
MERGE
}
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38380975
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bubuzu,
А апдейт несуществующей строки не выдаст никаких ошибок, и в catch ловить будет нечего.

Надо проверить, есть ли запись, если нет - сделать insert, и вот ошибку insert по duplicate key (в том маловероятном случае, если между проверкой и insert'ом такая запись успела появиться) ловить в catch.
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38381011
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинА апдейт несуществующей строки не выдаст никаких ошибок

Он выдаст RowsAffected 0. Этого достаточно для проверки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38381051
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
При чем тут RowsAffected 0? Это событие поймает catch?
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38381128
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кот МатроскинЭто событие поймает catch?
Нет, но его поймает if.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38381210
bubuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскинbubuzu,
А апдейт несуществующей строки не выдаст никаких ошибок, и в catch ловить будет нечего.

Псевдокод всё на свете поймает. :)

Кот МатроскинНадо проверить, есть ли запись, если нет - сделать insert, и вот ошибку insert по duplicate key (в том маловероятном случае, если между проверкой и insert'ом такая запись успела появиться) ловить в catch.
А если я буду в read commited транзакции проверять наличие такой записи. Может выскочить эксцепшен с нарушением индекса ?
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38381218
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bubuzuА если я буду в read commited транзакции проверять наличие такой записи.
Может выскочить эксцепшен с нарушением индекса ?
Уровень изоляции транзакции тут абсолютно пофиг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38384937
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create procedure Event_SetParam 
  @ID    int,
  @Param varchar(256),
  @Value varchar(max)
as
  update Event_Params
    set Value = @Value
    where ID = @ID
      and Param = @Param
  if @@ROWCOUNT = 0    
    insert Event_Params ( ID, Param, Value )
      select @ID, @Param, @Value
go
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38384953
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Old Nick
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create procedure Event_SetParam 
  @ID    int,
  @Param varchar(256),
  @Value varchar(max)
as
  update Event_Params
    set Value = @Value
    where ID = @ID
      and Param = @Param
  if @@ROWCOUNT = 0    
    insert Event_Params ( ID, Param, Value )
      select @ID, @Param, @Value
go



гигабайт разве здесь все равно через параметр не будет передан?
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38385435
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

Параметры типа Blob передаются по ссылке.
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38385488
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Old NickArm79,

Параметры типа Blob передаются по ссылке.

даже в случае внешнего приложения? Мне кажется, что нет. По ссылке - это работа внутри SQL сервера
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38385492
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Old NickArm79,

Параметры типа Blob передаются по ссылке.

С клиента, угу :)
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38386147
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вы чего такие тяжелые? Не надо, не передавайте. Вопрос то не в этом.
Я показал пример реализации для ТС. Просто выдрал скрипт из SVN.
Дальше самостоятельно додумать сил нет?
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38386155
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Old NickНу вы чего такие тяжелые? Не надо, не передавайте. Вопрос то не в этом.
Я показал пример реализации для ТС. Просто выдрал скрипт из SVN.
Дальше самостоятельно додумать сил нет?

Я к тому, что давать топикстартеру пример с неявными допущениями, учитывая его уровень, не стоит.
У меня вот сил хватило, поэтому уточнил.

ТС:
все у вас правильно, нужно делать разными запросами, и не через ХП. Единственное, в вашем случае, я бы эти два запроса обернул в одну транзакцию.
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38386607
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bubuzuКак разруливаются такие ситуации.
Основная задача в том, чтобы разрулить её атомарно - обеспечить невозможность ситуации "два процесса одновременно проверили отсутствие записи и оба начали вставлять по гигабайту". Здесь в первую очередь стоит понять, устроят ли нас подтяжки в виде завершения одного из них с ошибкой. Если да - от этого более или менее спасает уникальный индекс, но ГИГАБАЙТ будет прокачан напрасно. Если нет - надо делать что-то более сложное и, насколько я понимаю, постараться обеспечить возможность другим работать с таблицей, пока процесс качает на сервер ГИГАБАЙТ.

В целом, первое, что приходит в голову - в случае отсутствия записи сначала вставлять её (без блоба), а потом модифицировать (качать гигабайт). Таким образом мы сразу вывесим надёжный флаг, а в код можем вставить проверку "если вставка свалилась, значит, кто-то другой успел вставить, поэтому идём на вариант модификации".

Отдельное удовольствие Вы получите, если записи из таблицы могут удаляться. Тогда вполне реален вариант "exists вернул true, а вот update ушёл в молоко", с ним тоже надо возиться. В общем, всё немного сложнее, чем в примере старины Ника :)
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38386622
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerв код можем вставить проверку "если вставка свалилась, значит, кто-то
другой успел вставить, поэтому идём на вариант модификации".
Который тоже "уйдёт в молоко", поскольку тот, кто "успел вставить" ещё не закоммитился.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38386661
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovsoftwarerв код можем вставить проверку "если вставка свалилась, значит, кто-то
другой успел вставить, поэтому идём на вариант модификации".
Который тоже "уйдёт в молоко", поскольку тот, кто "успел вставить" ещё не закоммитился.

Дим, мне кажется, Вам стоит вспомнить, когда именно сваливается второй соискатель.
...
Рейтинг: 0 / 0
IF EXISTS UPDATE ELSE INSERT
    #38386695
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerмне кажется, Вам стоит вспомнить, когда именно сваливается второй
соискатель.
Трудно вспомнить то, чего никогда не знал. Я не знаю когда в MS SQL свалится второй
соискатель при каждом сочетании уровней изоляции их транзакций и прочих настроек.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / IF EXISTS UPDATE ELSE INSERT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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