nie zapomnij o transakcjach. Wydajność jest dobra, ale proste podejście (JEŻELI ISTNIEJE...) jest bardzo niebezpieczne.
Gdy wiele wątków próbuje wykonać operację wstawiania lub aktualizowania, można łatwo uzyskać naruszenie klucza podstawowego.
Rozwiązania dostarczone przez @Beau Crawford i @Esteban pokazują ogólny pomysł, ale podatne na błędy.
Aby uniknąć zakleszczeń i naruszeń PK, możesz użyć czegoś takiego:
begin tran
if exists (select * from table with (updlock,serializable) where key = @key)
begin
update table set ...
where key = @key
end
else
begin
insert into table (key, ...)
values (@key, ...)
end
commit tran
lub
begin tran
update table with (serializable) set ...
where key = @key
if @@rowcount = 0
begin
insert into table (key, ...) values (@key,..)
end
commit tran