(moja odpowiedź jest poniżej, ale potem zdałem sobie sprawę, że jest to lepsze pytanie & odpowiedź na to co Insert into a MySQL table or update if exists)
Można sprawdzić, jeśli wiersz istnieje, a następnie INSERT lub UPDATE, ale gwarantuje to będzie wykonanie dwóch operacji SQL zamiast jednego:
- sprawdzić, czy rząd istnieje
- wkładka lub aktualizacji wiersza
lepszym rozwiązaniem jest zawsze aktualizować pierwszy, a jeśli nie wiersze zostały zaktualizowane, a następnie zrobić INSERT, tak:
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
if @@ROWCOUNT = 0
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
Spowoduje to wykonanie jednej operacji SQL lub dwóch operacji SQL, w zależności od tego, czy wiersz już istnieje.
Ale jeśli wydajność jest naprawdę problem, to musisz dowiedzieć się, czy operacje są bardziej prawdopodobne, INSERT lub UPDATE. Jeśli AKTUALIZACJE są bardziej powszechne, wykonaj powyższe czynności. Jeśli INSERT są bardziej powszechne, możesz to zrobić odwrotnie, ale musisz dodać obsługę błędów.
BEGIN TRY
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
END TRY
BEGIN CATCH
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
END CATCH
być naprawdę pewien, czy trzeba zrobić UPDATE lub INSERT, trzeba wykonać dwie operacje w ramach jednej transakcji. Teoretycznie, zaraz po pierwszej aktualizacji lub INSERT (lub nawet kontroli EXISTS), ale przed następną instrukcją INSERT/UPDATE, baza danych mogła ulec zmianie, powodując, że druga instrukcja i tak się nie powiedzie. Jest to niezwykle rzadkie, a koszty transakcji mogą nie być tego warte.
Alternatywnie można użyć pojedynczej operacji SQL o nazwie MERGE, aby wykonać INSERT lub UPDATE, ale to także prawdopodobnie przesada w przypadku tej operacji jednorzędowej.
Rozważ przeczytanie o SQL transaction statements, race conditions, SQL MERGE statement.
Co powiesz na użycie klauzuli ** MERGE ** wraz z tabelą tymczasową z danymi użytkownika? Czy to nie jest lepsze? –
Sakhile - Tak, jest - więc gdzie jest Twoja odpowiedź w sekcji ... odpowiedzi ...? –
"MERGE" byłby odpowiedni dla tego przypadku użycia, ale należy zauważyć, że został wprowadzony tylko w SQL Server 2008 (przypuszczalnie OP nie jest jeszcze używany w 2005 r. Sześć lat później). –