PDA

View Full Version : [SQL] Update o Inserimento in sole 2 query


AMD_GO
13-12-2010, 15:26
Salve ragazzi, vorrei risolvere una questione in un determinato modo. Mi spiego: ho una tabella nella quale devo aggiornare, se esiste, una determinata riga; se invece non esiste, la devo aggiungere.

prendiamo per esempio la seguente tabella, con una riga già presente




key value
riga1 1 10


In pratica vorrei risolvere il tutto, se è possibile, scrivendo solo due query, cioè:

query 1)
UPDATE tabella SET value = 10 WHERE key = 1

poi utilizzo la funzione affected_rows per vedere se è stato modificato qualcosa. quindi, se è stato modificato qualcosa, ok; se invece non è stato modificato niente, devo fare un INSERT. a questo punto sorge un problema.

quindi, un pò di pseudo codice:

eseguo query 1

if ( affected_rows )
ok
else
INSERT

cosa succede? se eseguo "query 1" in pratica sto aggiornando la riga1 con value = 10, ma la riga1 ha già value = 10, quindi la tupla esiste già ma non la aggiorna e affected_rows = 0.
A questo punto si entra nell'else dove viene fatto un inserimento, ma giustamente con errore perchè mi da un duplicato di chiave.

Come risolvere in sole 2 query? è possibile? oppure dentro l'else devo fare una select per controllare che quella tupla non esista già prima di fare l'insert??? io vorrei evitare proprio questo.... oppure ancora, è possibile gestire l'errore che mi da php quando faccio l'insert con un valore di chiave duplicato???


Spero di essermi spiegato, grazie a tutti!!!!

AMD_GO
14-12-2010, 10:58
nessuno nessuno che mi aiuta??

dojolab
14-12-2010, 11:01
nessuno nessuno che mi aiuta??

I vincoli di integrità :) bisognerebbe (studiarli) sfruttarli.
Chiave primaria, o chiave unica.

ON DUPLICATE KEY UPDATE

Alla fine della sintassi di insert.
:D

AMD_GO
14-12-2010, 12:03
I vincoli di integrità :) bisognerebbe (studiarli) sfruttarli.
Chiave primaria, o chiave unica.

ON DUPLICATE KEY UPDATE

Alla fine della sintassi di insert.
:D

Grazie per la risposta. Per i vincoli di integrità posso dirti che li conosco e li ho studiati, infatti avevo scritto "devo fare una select per controllare che quella tupla non esista già prima di fare l'insert??? io vorrei evitare proprio questo...." e in questo modo avrei soddisfatto il vincolo...

Tuttavia la clausola
ON DUPLICATE KEY UPDATE
non la conoscevo ed era proprio quella che stavo cercando! Grazie ancora!

dojolab
14-12-2010, 12:08
non la conoscevo ed era proprio quella che stavo cercando! Grazie ancora!

Di niente :)