Удалить и вставить или выбрать и обновить - PullRequest
0 голосов
/ 13 апреля 2011

У нас есть таблица состояния. Когда статус меняется, мы удаляем старую запись и вставляем новую.

Нам интересно, будет ли быстрее сделать выбор, чтобы проверить, существует ли он, а затем вставить или обновить.

Хотя это похоже на следующий вопрос, это не то же самое, поскольку мы меняем отдельные записи, а другой вопрос - полное обновление таблицы.

УДАЛИТЬ, ВСТАВИТЬ ПРОТИВ ОБНОВЛЕНИЯ || ВСТАВИТЬ

Ответы [ 5 ]

4 голосов
/ 13 апреля 2011

Поскольку вы говорите о SQL Server 2008, рассматривали ли вы MERGE ? Это единственный оператор, который позволяет вам выполнить обновление или вставку:

create table T1 (
    ID int not null,
    Val1 varchar(10) not null
)
go
insert into T1 (ID,Val1)
select 1,'abc'
go
merge into T1
using (select 1 as ID,'def' as Val1) upd on T1.ID = upd.ID --<-- These identify the row you want to update/insert and the new value you want to set. They could be @parameters
when matched then update set Val1 = upd.Val1
when not matched then insert (ID,Val1) values (upd.ID,upd.Val1);
1 голос
/ 13 апреля 2011

Лично я считаю метод ОБНОВЛЕНИЯ лучшим.Вместо того, чтобы сначала выполнить SELECT, чтобы проверить, существует ли уже запись, вы можете сначала попытаться выполнить ОБНОВЛЕНИЕ, но если строки не затронуты (используя @@ ROWCOUNT), вы можете сделать INSERT.

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

1 голос
/ 13 апреля 2011

А как насчет INSERT ... ON DUPLICATE KEY?Сначала выполните выбор, чтобы проверить, существует ли запись, и проверьте в своей программе результат, который создает состояние гонки.Это может быть не важно в вашем случае, если существует только один экземпляр программы.

INSERT INTO users (username, email) VALUES ('Jo', 'jo@email.com')
ON DUPLICATE KEY UPDATE email = 'jo@email.com'
1 голос
/ 13 апреля 2011

Ваше предложение будет означать всегда две инструкции для каждого изменения статуса.Обычный способ - сделать UPDATE, а затем проверить, изменила ли операция какие-либо строки (большинство баз данных имеют переменную типа ROWCOUNT, которая должна быть больше 0, если что-то изменилось).Если это не так, сделайте ВСТАВКУ.

Поиск UPSERT для поиска шаблонов для вашей конкретной СУБД

1 голос
/ 13 апреля 2011

Вы можете использовать @@ ROWCOUNT и выполнить UPDATE. Если затронуто 0 строк - выполните INSERT после, ничего другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...