@@ROWCOUNT и Exists

Darooma
Дата: 10.06.2011 14:32:06
Есть таблица CustomerStores (CustomerId, StoreId), которая связывает связью "многие-ко-многим" 2 таблицы. Первичного ключа у нее нет. Нужно добавть запись в эту таблицу, но только в том случае, если ее там нет.

Есть 2 варианта

if not exists (
  select top 1 from CustomerStores where CustomerId=@CustomerId and StoreId=@StoreId)
insert into ....
и

update CustomerStores 
set CustomerId=@CustomerId and StoreId=@StoreId
where CustomerId=@CustomerId and StoreId=@StoreId
if @@ROWCOUNT = 0
inset into ....

Какой вариант более рационален и логичен?
SomewhereSomehow
Дата: 10.06.2011 14:36:39
Darooma,

я чесс говоря второй вараинт вообще не понял..зачем апдейтить-то? обычной выборкой на экзистс как-то логичнее, как в первом варианте... только топ можно убрать, сервер и так не дурак =)
кстати, что мешает сделать составной ключ по двум полям, чтобы обеспечить целостность данных?
ura
Дата: 10.06.2011 14:58:38
insert into ....
where not exists(select *...)
Darooma
Дата: 10.06.2011 15:13:50
ura,

тоже вариант.
Как насчет concurrency? Оно может случится в этом примере?
Shlippenbaranus
Дата: 10.06.2011 15:24:26
Darooma
ura,

тоже вариант.
Как насчет concurrency? Оно может случится в этом примере?


Какая версия MS SQL? В 2008, насколько я знаю, уже появилась конструкция merge. Как раз подходит для такой задачи.
Darooma
Дата: 10.06.2011 15:28:35
Shlippenbaranus
Darooma
ura,

тоже вариант.
Как насчет concurrency? Оно может случится в этом примере?


Какая версия MS SQL? В 2008, насколько я знаю, уже появилась конструкция merge. Как раз подходит для такой задачи.

2008.
что это за инструкция?
alexeyvg
Дата: 10.06.2011 15:30:02
Darooma
Shlippenbaranus
Какая версия MS SQL? В 2008, насколько я знаю, уже появилась конструкция merge. Как раз подходит для такой задачи.

2008.
что это за инструкция?
Так и называется - MERGE
Darooma
Дата: 10.06.2011 15:31:58
alexeyvg
Darooma
пропущено...

2008.
что это за инструкция?
Так и называется - MERGE

Я имею ввиду как ее применить к моему примеру?
Shlippenbaranus
Дата: 10.06.2011 15:33:02
SomewhereSomehow
я чесс говоря второй вараинт вообще не понял..зачем апдейтить-то?


Ну, это есть стандартная задача - проапдейтить строку, если она существует, или вставить новую строку, если не существует. Такой себе "параметрический счетчик". Используется, например, для подсчета какой-нибудь суммы помесячно. В начале каждого месяца нужно заводить новую строку, а потом ее обновлять. При этом нужно следить, чтобы строка для какого-то месяца не завелась два раза.
SomewhereSomehow
Дата: 10.06.2011 15:40:20
Shlippenbaranus,

Darooma
Есть таблица CustomerStores (CustomerId, StoreId), которая связывает связью "многие-ко-многим" 2 таблицы. Первичного ключа у нее нет. Нужно добавть запись в эту таблицу, но только в том случае, если ее там нет.


я что-то ни разу не вижу здесь ни слова про то, что надо обновить запись. Да и что обновлять-то...значение на само себя же? и мердж здесь, имхо, тоже наифиг не нужен. обычный контроль вставки дубликатов...проверяем наличие и добавляем.