CodeGym /Corsi /SQL SELF /Aggiornamento dei dati usando UPDATE

Aggiornamento dei dati usando UPDATE

SQL SELF
Livello 21 , Lezione 2
Disponibile

Oggi arriviamo a un altro mattoncino importante della tua nuova base di conoscenze: l’aggiornamento dei dati. Vediamo come in PostgreSQL si cambia l’informazione già presente usando il comando UPDATE. Perché è importante? Beh, perché nella vita reale i dati non sono statici. Immagina che il tuo amico cambi numero di telefono, oppure uno studente passi a un altro gruppo — ovviamente vorrai aggiornare questi dati nel database.

Quando il tuo amore delle superiori Svetka Sokolova improvvisamente diventa Svetka Khachaturyan (eh, la vita è così), serve cambiare qualcosa nel database. Gli scenari dove serve aggiornare i dati sono frequenti:

  • Correzione di errori in una riga.
  • Aggiornamento di informazioni (trasloco, cambio di stato).
  • Modifica di massa dei dati, tipo aumento degli stipendi ai dipendenti.

L’aggiornamento dei dati è il modo per cambiare i valori di una o più colonne per una o più righe di una tabella, senza aggiungere nuove righe.

Sintassi del comando UPDATE

Il comando UPDATE in PostgreSQL ha una sintassi abbastanza chiara. Vediamo la struttura:

UPDATE tabella
SET column1 = value1,
    column2 = value2
WHERE condizione;

Spiegazioni:

  • tabella: il nome della tabella dove vuoi cambiare qualcosa.
  • SET column = value: parametro che indica quale colonna cambiare e con quale valore.
  • WHERE condizione: la condizione che indica quali righe aggiornare (fondamentale per non cambiare tutto a caso).

Dettaglio chiave: se ti dimentichi di aggiungere WHERE (o lo scrivi male), le tue modifiche toccheranno tutte le righe della tabella. E questo può essere un bel casino.

Esempio: cambiare il nome di uno studente

Supponiamo di avere una tabella students con le colonne id, name, email. Vogliamo cambiare il nome dello studente con id = 1 in "Maria Chi".

UPDATE students
SET name = 'Maria Chi'
WHERE id = 1;

Questo comando trova la riga con id = 1 e aggiorna la colonna name con il nuovo valore. Facile, no?

Aggiornare più colonne

Spesso serve cambiare più valori in una riga. Per esempio, immagina che uno studente abbia cambiato sia il nome che l’indirizzo email. Ecco come si fa:

UPDATE students
SET name = 'Otto Lin',
    email = 'otto.lin@example.com'
WHERE id = 2;

Qui aggiorniamo sia name che email per lo studente con id = 2. PostgreSQL ti permette di specificare più coppie colonna=valore separate da virgole nella sezione SET.

Aggiornare più righe

Cosa fare se devi cambiare i dati per più righe insieme? Per esempio, vuoi spostare un gruppo di studenti in un nuovo flusso. Per questo puoi aggiornare le righe che corrispondono a un certo criterio. Supponiamo di avere il campo group_number e vogliamo spostare tutti gli studenti dal gruppo 101 al gruppo 202:

UPDATE students
SET group_number = 202
WHERE group_number = 101;

Questo comando aggiorna tutte le righe dove group_number è 101, cambiandolo in 202.

5. Condizione WHERE: occhio!

Come detto prima, WHERE è il tuo salvagente. Senza di lui la query toccherà tutte le righe della tabella. Per esempio, il comando qui sotto aggiornerà il GRUPPO di tutti gli studenti, non solo quelli del gruppo 101. E questo non lo vuoi di sicuro:

UPDATE students
SET group_number = 202;

Per favore, aggiungi sempre WHERE se non vuoi distruggere i dati per sbaglio. Meglio essere prudenti.

Pensa al comando UPDATE come a un comando che cambia le colonne della tabella, non le righe. Il suo scopo è assegnare a tutte le celle di una certa colonna un certo valore. Solo la presenza di WHERE fa sì che non vengano cambiate tutte le righe.

Aggiornare usando dati da un’altra tabella

A volte non serve solo “scrivere” un valore a mano, ma aggiornare i valori nella tabella A usando dati dalla tabella B. Capita spesso — soprattutto se i dati sono separati: tipo calcoli in una tabella e profili utente in un’altra.

Supponiamo di avere la tabella students e dobbiamo aggiornare la colonna debt usando la tabella payments, dove c’è l’importo attuale del debito (due_amount). Ogni riga in students corrisponde a una riga in payments tramite il campo student_id.

La sintassi sarà così:

UPDATE students
SET debt = payments.due_amount
FROM payments
WHERE students.id = payments.student_id;

Cosa succede qui:

  • PostgreSQL usa FROM payments come sorgente dati.
  • Con la condizione WHERE collega le righe tra le tabelle.
  • Aggiorna solo le righe di students che hanno una corrispondenza in payments.

Importante capire: dentro questo UPDATE ... FROM in realtà c’è un join nascosto — JOIN, solo che non c’è la parola chiave JOIN.

Il punto è che sotto il cofano c’è un JOIN nascosto. In pratica sarebbe tipo così:

UPDATE students
SET debt = p.due_amount
FROM payments p
    JOIN students s ON s.id = p.student_id
WHERE students.id = p.student_id;

Come vedere cosa verrà aggiornato

Prima di lanciare UPDATE, è molto saggio vedere cosa verrà cambiato. Puoi farlo con un SELECT scritto con la stessa logica:

SELECT
    students.id, 
    students.name, 
    students.debt AS old_debt, 
    payments.due_amount AS new_debt
FROM students
    JOIN payments ON students.id = payments.student_id;

Il risultato ti mostra:

  • il vecchio valore del debito (old_debt);
  • il nuovo valore che arriva dalla tabella payments (new_debt).

Questo approccio ti aiuta a controllare la logica prima di sovrascrivere i dati per sempre.

Possibili trappole

  • Se payments contiene più righe per uno studente, UPDATE darà errore: more than one row returned. Devi usare un’aggregazione (MAX, SUM, LIMIT 1) oppure assicurarti che student_id in payments sia unico.
  • Ricorda che UPDATE ... FROM è una feature specifica di PostgreSQL e non funziona così in altri DBMS (tipo MySQL).

Esempi pratici

Esempio 1: Cambiare lo status degli studenti

Immagina che gli studenti che hanno finito il corso ricevano lo status "laureato". Abbiamo la colonna status. Per aggiornare lo status degli studenti con completed_course = true:

UPDATE students
SET status = 'laureato'
WHERE completed_course = true;

Esempio 2: Aumento degli stipendi ai dipendenti

Se hai una tabella employees e vuoi aumentare lo stipendio del 10% a tutti quelli che lavorano nel reparto vendite:

UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';

Qui usiamo un’operazione matematica direttamente nella sezione SET. Comodo per modifiche di massa.

Esempio 3: Aggiornamento condizionale

A volte serve aggiornare i dati in base a una condizione. Per esempio, se lo stipendio di un dipendente è meno di 50.000, deve aumentare del 20%, altrimenti del 10%:

UPDATE employees
SET salary = CASE
                WHEN salary < 50000 THEN salary * 1.20
                ELSE salary * 1.10
             END;

Questo comando usa la struttura CASE per impostare regole diverse di aggiornamento a seconda del valore di salary.

Errori tipici con UPDATE

Probabilmente hai già intuito qual è l’errore più comune? Esatto, dimenticare il WHERE. Prova a immaginare: hai un database con 10.000 dipendenti e per sbaglio aumenti lo stipendio a tutti. Anche se i tuoi colleghi sarebbero contenti, per la tua carriera non è il massimo…

Un altro errore frequente è aggiornare la colonna sbagliata. Controlla sempre cosa e dove stai scrivendo. Un semplice SELECT prima di UPDATE può salvarti un sacco di tempo.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION