Ispirato 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…
SELECT LAST_INSERT_ID()
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