Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 14 di 58
  • livello intermedio
Indice lezioni

UPDATE e DELETE: modifica e cancellazione dei dati

Imparare ad aggiornare ed eliminare i dati dalle tabelle di un database MySQL: ecco come usare i comandi UPDATE e DELETE.
Imparare ad aggiornare ed eliminare i dati dalle tabelle di un database MySQL: ecco come usare i comandi UPDATE e DELETE.
Link copiato negli appunti

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.

Ti consigliamo anche