| |
 |
| |
| Home |
|
|
 | | |
| Da vedere |
|
|
 |
| |
| OnFocus |
|
|
 |
| |
| Siti Amici |
|
|
|
|
|
|
|
 |
|
| Autore: Alessandro Coscia |
Categoria: mysql |
Livello: normale  |
Meno codice più risultati con INSERT ... ON KEY DUPLICATE UPDATEDue query in una, INSERT e se il record già esiste fa un UPDATEIspirato da un articolo di Kevin Burton e da "Mysql Performance Blog" vi parlo di una particolarità di MySql di cui ho sentito parlare poco sui blog italiani:
INSERT ... ON KEY DUPLICATE UPDATE
Cosa fa (tradotto da mysql.org)
Se specifichi ON DUPLICATE KEY UPDATE e la riga che stai inserendo genera un indice duplicato fra chiavi UNIQUE o PRIMARY KEY viene eseguita una UPDATE sulla riga già presente.
Vantaggi
Ci permette di fare due query in una, di scrivere meno codice e performance migliori (performance test).
Nella PRATICA
Immaginiamo di dover loggare il passaggio dei nostri visitatori in una tabella e di doverne archiviare l'ip, il quale è una chiave.
Senza questa funzionalità di MySql dovremmo prima fare una SELECT per vedere se quell'ip esiste già, e solo in seguito decidere se fare un INSERT oppure un UPDATE (per esempio per tenere traccia della data dell'ultima visita o del numero di hits).
Soluzione
Anzichè fare due query al database sarà possibile eseguirne una sola.
Esempio:
INSERT INTO ipstats VALUES('192.168.0.1',1,NOW())
ON duplicate KEY UPDATE hits=hits+1, last = NOW();
|
In questo modo se l'ip non esiste viene inserito con numero di hits = 1 altrimenti viene incrementato il numero di hits e aggiornata la data di ultima visita.
LAST_INSERT_ID()
Se avete una chiave auto_increment ci sarà un inconveniente facilemente risolvibile, infatti...
ha senso solo per gli INSERT ma non nel caso in cui venga eseguito l'UPDATE
Soluzione
E' sufficiente quindi aggiungere id=LAST_INSERT_ID(id) nell'UPDATE, dove id è ovviamente il nome della vostra colonna auto_increment.
Esempio da Mysql.org
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
|
Per ulteriori informazioni potete consultare il manuale ufficiale: INSERT ON DUPLICATE
|
|
 |
|
|
|