(la mia risposta è al di sotto, ma dopo che ho capito che c'è una migliore domanda & risposta su questo a Insert into a MySQL table or update if exists)
È possibile verificare se esiste la riga, e quindi inserire o UPDATE, ma questo garantisce si esibiranno due operazioni SQL invece di uno:
- controllo se riga esiste
- inserimento o aggiornamento fila
una soluzione migliore è di aggiornare sempre al primo posto, e se nessuna riga sono state aggiornate, poi fare un INSERT, in questo modo:
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')
Questo richiederà una sola operazione SQL o due operazioni SQL, a seconda che la riga esista già.
Ma se le prestazioni sono davvero un problema, è necessario capire se è più probabile che le operazioni siano INSERT o UPDATE. Se UPDATE sono più comuni, fai quanto sopra. Se gli INSERT sono più comuni, puoi farlo al contrario, ma devi aggiungere la gestione degli errori.
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
essere davvero certo se avete bisogno di fare un UPDATE o INSERT, devi fare due operazioni in una singola transazione. Teoricamente, subito dopo il primo UPDATE o INSERT (o anche il controllo EXISTS), ma prima della successiva istruzione INSERT/UPDATE, il database potrebbe essere cambiato, causando comunque il fallimento della seconda istruzione. Questo è estremamente raro e il sovraccarico per le transazioni potrebbe non valerne la pena.
In alternativa, è possibile utilizzare un'unica operazione SQL denominata MERGE per eseguire un INSERT o un UPDATE, ma probabilmente è anche eccessivo per questa operazione a una riga.
Considerare la lettura di SQL transaction statements, race conditions, SQL MERGE statement.
Come utilizzare una ** clausola MERGE ** insieme a una tabella temporanea con i dettagli dell'utente? Non è meglio? –
Sakhile - Sì, lo è - quindi dove è la tua risposta nella sezione ... risposta ...? –
'MERGE' sarebbe appropriato per questo caso d'uso ma si dovrebbe notare che è stato introdotto solo in SQL Server 2008 (presumibilmente, l'OP non sta ancora utilizzando il 2005 sei anni dopo). –