Corsi on-line
Chiudi
Newsletter:
  • Seguici su Facebook
  • Seguici su Twitter
  • Seguici su Google+
  • Seguici via RSS
  • Seguici col tuo Smartphone

Meno query grazie a INSERT... ON DUPLICATE KEY UPDATE

Articolo scritto da Max Bossi

E' risaputo che una corretta gestione delle query è requisito essenziale per avere applicazione stabili ed efficenti.
In questo articolo illustreremo una sintassi poco conosciuta ma altamente performante, sto parlando della clausola ON DUPLICATE KEY UPDATE.

Questa clausola viene utilizzata durante una INSERT ed ha lo scopo di verificare, prima dell'inserimento, che non vi sia una duplicazione di una chiave primaria (PRIMARY KEY) o di una chiave unica (UNIQUE KEY); qualora ciò si verificasse il motore di MySQL effettuerà un'UPDATE al posto dell'INSERT.

(L'articolo continua più sotto...)

Il vantaggio di questa clausola è evidente: si scrive una sola query invece di due con vantaggi in termini di performances e pulizia del codice.

Facciamo un esempio pratico. Supponiamo di voler realizzare un semplice script che effettui il logging dei visitatori del nostro sito. Di seguito la struttura della tabella del nostro DB:

Volendo registrare ogni IP in transito sulle nostre pagine dovremo, secondo la logica consueta, effettuare prima di tutto una SELECT preliminare per verificare che l'IP non sia già presente nel DB e solo in caso di risposta negativa (IP non presente) effettuare una query di INSERT.

Grazie alla sintassi INSERT ... ON DUPLICATE KEY UPDATE ... potremo ottenere lo stesso risultato con una sola query:

INSERT INTO ip_visitatori VALUES('123.123.123.123', 1, NOW()) 
ON DPLICATE KEY
UPDATE numero_visite = numero_visite + 1, ultima_visita = NOW();
Così facendo se l'IP non è presente viene effettuato l'inserimento, in caso contrario viene eseguito un semplice aggiornamento del record interessato. L'utilizzo di questa sintassi consente di ottenere un beneficio in termini di performances pari al 30%.

Con un po' di fantasia ed ingegno la clausola in oggetto ci potrà tornare molto utile in svariate circostanze.
Ad esempio possiamo utilizzarla in combinazione con una condizione. Facciamo un esempio: supponiamo di avere una tabella di un ipotetico sito di aste on-line così strutturata:

Si supponga di voler procedere all'inserimento di una nuova offerta, se l'asta ha già un offerta si procederà ad un semplice aggiornamento ma solo se l'offerta è più alta di quella già presente:
INSERT INTO offerte VALUES(1, 120) 
ON DPLICATE KEY
UPDATE migliore_offerta = IF(VALUES(migliore_offerta) < 120, 120, VALUES(migliore_offerta))
Mediante una semplice query abbiamo risolto in un colpo solo... in caso contrario avremmo dovuto utilizzare diverse query con conseguente spreco di risorse (ed un maggior rischio di incorrere in errori).

Corsi
Corso MS AccessCorso MS Access
Impara a creare e gestire database in maniera semplice e veloce. A partire da 39 €.
Corso MySQLCorso MySQL
Gestione del database open-source. A partire da 49 €.
Corso SQL e DatabaseCorso SQL e Database
Creazione e gestione di database relazionali. A partire da 39 €.
Vedi anche...
Annunci

Mr.Webmaster

Pubblicità
Chi Siamo
Contattaci
Collabora
Note Legali
© 2003 - 2012 Mr.Webmaster - Il portale dei Webmaster Italiani - Tutti i diritti riservati | Powered by IKIweb Internet Media S.r.l. - PIVA 02848390122