Dopo aver visto le modalità per inserire dati nel database e per interrogarlo, passiamo in rassegna le istruzioni per modificarne i dati.
Il comando UPDATE
Il comando UPDATE
serve a modificare dati già inseriti nelle tabelle del database. La sua sintassi è la seguente:
UPDATE nome_tabella
SET nomeCampo1 = <valore1> [,nomeCampoX = <valoreX>]*
[ WHERE predicato ]
Il significato del comando è quello di modificare i campi indicati nella clausola SET
delle righe della tabella nome_tabella che soddisfano il predicato indicato nella clausola WHERE
. Su quest’ultima non ci dilunghiamo perché per essa valgono le stesse considerazioni fatte per il comando SELECT
. Diciamo soltanto che se viene omessa, l’aggiornamento avverrà su tutte le righe della tabella. Di conseguenza bisogna porre particolare attenzione al momento del lancio di questo comando.
L’utilizzo tipo è la modifica di un singolo record, utilizzando l’id:
UPDATE Person SET given_names = 'Stefano' WHERE ID = 4
Possiamo fare modifiche massive, ad esempio mettendo a 1 il valore del campo volume di tutti i record dove tale campo assume il valore nullo:
UPDATE Book SET volume = 1, note='1 solo volume' WHERE volume IS NULL
In questo esempio vediamo anche come si possono applicare più assegnazioni (sul campo note) nello stesso comando.
L’assegnamento può anche usare altri campi del record da modificare. Ad esempio qui impostiamo in ogni record il campo note alla concatenazione di un testo con il titolo del libro:
UPDATE Book SET note=CONCAT('titolo: ', title)
L’espressione scalare utilizzata per aggiornare una colonna può anche essere il risultato di una query scalare, cioè una interrogazione che restituisce una sola riga e una sola colonna:
UPDATE Book SET note= 'editore: ' + (SELECT name FROM Publisher WHERE Publisher.ID = Book.publisher)
In questo caso abbiamo aggiornato il campo note inserendo il nome dell’editore del libro.
Aggiungiamo infine che il comando è atomico, ossia o avviene l’aggiornamento di tutte le righe della tabella, oppure, se si verifica anche un solo errore su una di esse (ad esempio un valore troppo lungo, oppure un vincolo violato), il comando non verrà eseguito su nessuna di esse (quindi o successo completo o tutto rimane invariato).