Lo scopo di questo articolo è di riportare in un solo posto la sintassi per eseguire un Update con il linguaggio SQL su tutti i principali RDBMS (Relational Database Management System) sia nella versione base e sia nel caso in cui la query richieda una join con una seconda tabella. Vedremo in particolare i database Sql Server, Oracle, MySql e Access.
Per la versione base la sintassi è comune a tutti i principali RDBMS. Supponiamo ad esempio di dover incrementare del dieci per cento l’importo della fattura numero 1. Scriveremo
UPDATE Fatture
SET Importo = Importo * 1.1
WHERE IdFattura = 1;
Vedremo invece che la versione dell’update “con join” varia abbastanza tra un RDBMS e l’altro, per quanto si tratta di una tipologia di query da scrivere abbastanza frequentemente. Tali diversità causano spesso frustrazione per uno sviluppatore SQL che scrive codice su più ambienti o per un junior che non riesce a trovare la sintassi giusta per il proprio database. In questo articolo cercheremo di porre fine a questa situazione declinando su Sql Server, Oracle, Access e MySql il seguente esercizio:
“incrementare del dieci per cento l’importo delle fatture dei clienti residenti in Lombardia”
Update su Sql Server
Su Sql Server occorre specificare subito dopo la parola UPDATE la tabella che si vuole aggiornare. In seguito occorre valorizzare la clausola SET. In essa non è possibile indicare la tabella a cui appartiene la colonna da aggiornare a sinistra dell’uguale. Essa infatti sarà definita implicitamente dalla tabella indicata dopo l’Update nella prima riga. Dopo la SET, sarà presente la clausola FROM che conterrà obbligatoriamente la tabella indicata dopo l’UPDATE, oltre a eventuali ulteriori tabelle collegate tramite una JOIN.
Il codice sarà dunque
UPDATE Fatture
SET Importo = F.Importo * 1.1
FROM Fatture AS F
INNER JOIN Clienti AS C
ON F.IdCliente = C.IdCliente
WHERE C.RegioneResidenza = 'Lombardia';
Nulla cambierebbe se volessimo aggiornare la colonna della tabella Fatture con un valore presente nella tabella Clienti. Risulta fondamentale notare che nel caso in cui IdCliente non fosse chiave primaria della tabella Clienti, sarebbe eseguito comunque un solo update non deterministico per le fatture associate a IdClienti duplicati.
Update con PL-SQL su Oracle
Come accennato nell’introduzione dell’articolo, la sintassi precedente non funziona su Oracle. In questo articolo https://oracle-base.com/articles/misc/updates-based-on-queries potete trovare vari metodo per eseguire questa tipologia di join, vi riporto quello secondo me più semplice che utilizza la MERGE.
MERGE INTO Fatture F
USING (SELECT *
FROM Clienti
WHERE RegioneResidenza = 'Lombardia') C
ON (F.IdCliente = C.IdCliente)
WHEN MATCHED THEN
UPDATE
SET F.Importo = F.Importo * 1.1;
Ricordo che secondo le impostazioni di default, su Oracle occorre eseguire esplicitamente una Commit per confermare l’update.
Nel caso in cui ci fossero più righe della tabella specificata nella Using con lo stesso IdCliente, la query precedente fallirebbe con errore “unable to get a stable set of rows in the source tables ORA-06512”
Update su MySql
Su MySql possiamo usare una sintassi simile a quella di SQL Server, ma non del tutto identica. Infatti non possiamo inserire una clausola FROM, ma dobbiamo scrivere la join direttamente nell’Update. Risulterà fondamentale specificare la tabella di appartenenza della colonna da modificare.
Il codice sarà dunque
UPDATE Fatture
INNER JOIN Clienti
ON Fatture.IdCliente = Clienti.IdCliente
SET Fatture.Importo = Fatture.Importo * 1.1
WHERE Clienti.RegioneResidenza = 'Lombardia';
Come su SQL Server, nel caso ipotetico in cui ci siano più righe con lo stesso valore di IdCliente all’interno della tabella Clienti, MySql esegue comunque un solo update non deterministico per le fatture associate a righe duplicate.
Update SQL su Access
Su Access possiamo usare la stessa sintassi di MySql. Occorre però porre molta attenzione nel caso in cui l’IdCliente è ripetuto più volte nella tabella Clienti. A differenza di Sql Server e di MySql, Microsoft Access esegue l’update (e quindi in questo caso l’incremento del dieci per cento) più di una volta. Vediamo un esempio concreto.
Tabella1
CAMPO1 | CAMPO2 |
1 | 10 |
Tabella2
CAMPO1 |
1 |
Dopo la query
UPDATE TABELLA1 AS A
INNER JOIN TABELLA2 AS B
ON A.Campo1 = B.Campo1
SET A.Campo2 = A.Campo2 * 1.1;
nella colonna Campo2 della Tabella1 sarà riportato il valore 12.1 proveniente da un doppio Update.
Continua a imparare
- Segui la lezione successiva sull’istruzione BULK INSERT
- Torna all’indice delle lezioni
- Visita la pagina del mio video corso online di SQL