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

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

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

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

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

Кот МатроскинНадо проверить, есть ли запись, если нет - сделать insert, и вот ошибку insert по duplicate key (в том маловероятном случае, если между проверкой и insert'ом такая запись успела появиться) ловить в catch.
А если я буду в read commited транзакции проверять наличие такой записи. Может выскочить эксцепшен с нарушением индекса ?
...
Рейтинг: 0 / 0
29.08.2013, 15:19
    #38381218
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS UPDATE ELSE INSERT
bubuzuА если я буду в read commited транзакции проверять наличие такой записи.
Может выскочить эксцепшен с нарушением индекса ?
Уровень изоляции транзакции тут абсолютно пофиг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.09.2013, 09:21
    #38384937
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS UPDATE ELSE INSERT
Код: 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
03.09.2013, 09:39
    #38384953
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS UPDATE ELSE INSERT
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
03.09.2013, 14:13
    #38385435
Old Nick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF EXISTS UPDATE ELSE INSERT
Arm79,

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

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

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

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

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

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

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

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

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

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


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