Modifica e cancellazione dei dati

Dopo aver visto come inserire e cercare i dati, vediamo ora come modificarli o eliminarli. Per gli aggiornamenti si usa l’istruzione UPDATE, di cui vediamo la sintassi:

UPDATE [LOW_PRIORITY] [IGNORE] nome_tabella
SET nome_colonna=espressione [, nome_colonna2=espressione2 ...]
[WHERE condizioni]
[ORDER BY ...]
[LIMIT numero_righe]

Il funzionamento è abbastanza intuitivo:

  • dopo UPDATE indichiamo quale tabella è interessata
  • con SET specifichiamo quali colonne modificare e quali valori assegnare
  • con WHERE stabiliamo le condizioni che determinano quali righe saranno interessate dalle modifiche (se non specifichiamo una WHERE tutte le righe saranno modificate)

Inoltre possiamo usare ORDER BY per decidere in che ordine effettuare gli aggiornamenti sulle righe, e LIMIT per stabilire un numero massimo di righe che saranno modificate. Evidentemente l’uso di ORDER BY difficilmente ha senso se non accoppiato con LIMIT.

L’UPDATE restituisce il numero di righe modificate; attenzione però: se tentate di assegnare ad una riga valori uguali a quelli che ha già, MySQL se ne accorge e non effettua l’aggiornamento. Ai fini della LIMIT la riga viene comunque conteggiata.

È possibile anche usare LOW_PRIORITY, come già visto per le INSERT, per ritardare l’esecuzione dell’aggiornamento ad un momento nel quale la tabella non è impegnata da altri client. Con la clausola IGNORE invece indichiamo al server di ignorare gli errori generati dall’aggiornamento. Eventuali modifiche che causassero chiavi doppie non saranno, in questo caso, effettuate.

In una UPDATE è possibile fare riferimento ad una colonna per utilizzare il suo valore precedente all’aggiornamento; ad esempio:

UPDATE vendite SET venduto=venduto+1 WHERE idVenditore=5;

In questo caso il valore della colonna venduto viene incrementato di 1.

L’operazione di UPDATE può essere effettuata anche su più tabelle. In questo caso indicheremo i nomi delle tabelle interessate con la stessa sintassi già vista per le join. Con gli update multi-tabella però non è possibile usare le clausole ORDER BY e LIMIT.

Per effettuare una UPDATE è necessario avere il privilegio UPDATE sulle tabelle da modificare più il privilegio SELECT su eventuali altre tabelle a cui viene fatto accesso in sola lettura.

Passiamo ora alla DELETE, con la quale cancelliamo una o più righe da una o più tabelle (per farlo dobbiamo avere il privilegio DELETE).
Questa è la sintassi per la DELETE su una sola tabella:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM nome_tabella
[WHERE condizioni]
[ORDER BY ...]
[LIMIT numero_righe]

Le opzioni LOW_PRIORITY e IGNORE hanno lo stesso significato visto per la UPDATE. La clausola QUICK è utile solo per tabelle MyISAM: velocizza l’operazione ma non effettua l’ottimizzazione degli indici. È utile se i valori degli indici cancellati saranno sostituiti da valori simili.

Anche ORDER BY e LIMIT funzionano come nella UPDATE: permettono di stabilire l’ordine delle cancellazioni e di limitare il numero di righe cancellate. Con la WHERE stabiliamo le condizioni in base alle quali le righe verranno eliminate. Se non la indichiamo, tutte le righe saranno eliminate.

La cancellazione di righe da una tabella può portare alla presenza di spazio inutilizzato nella tabella stessa: se si effettuano molte DELETE su una tabella sarà bene effettuare periodicamente una OPTIMIZE TABLE oppure eseguire l’utility myisamchk (vedere lezione 24).

Vediamo ora come effettuare una DELETE su più tabelle: per questa operazione esistono due possibili sintassi

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
nome_tabella[.*] [, nome_tabella[.*] …]
FROM tabelle
[WHERE condizioni]
oppure
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM nome_tabella[.*] [, nome_tabella[.*] …]
USING tabelle
[WHERE condizioni]

In questo caso può capitare che abbiamo la necessità di cancellare righe da una o più tabelle leggendo i dati anche da altre tabelle, senza cancellare niente da queste ultime. Le tabelle che subiranno le cancellazioni sono elencate dopo DELETE nella prima sintassi, e dopo FROM nella seconda. La join sulle tabelle da cui leggere i dati viene invece espressa con la clausola FROM per il primo caso, e con USING nel secondo.

Vediamo due esempi equivalenti:

DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;
DELETE FROM t1, t2 USING t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

In entrambi i casi verranno cancellate le righe corrispondenti da t1 e t2, ma solo quando esiste in t3 un ulteriore valore corrispondente. Come avrete notato, anche per la DELETE multi-tabella non è possibile usare le opzioni ORDER BY e LIMIT.

Quando vogliamo eliminare per intero il contenuto di una tabella possiamo utilizzare l’istruzione TRUNCATE che è più veloce:

TRUNCATE [TABLE] nome_tabella

Nella maggior parte dei casi, con la TRUNCATE la tabella viene eliminata e ricreata. Questo porta, fra l’altro, alla reinizializzazione dei valori AUTO_INCREMENT.

Both comments and pings are currently closed.

Comments are closed.