CodeGym /Corsi /SQL SELF /Eliminazione dei dati usando DELETE

Eliminazione dei dati usando DELETE

SQL SELF
Livello 21 , Lezione 3
Disponibile

Eliminare — non è solo una funzione, è un'arte! È importante eliminare solo quello che serve, senza toccare altro (i dati cancellati per sbaglio possono perseguitarti nei tuoi incubi notturni per un bel po'). Oggi impariamo a farlo con attenzione e come si deve!

Eliminare i dati — è il processo di rimozione di una o più righe da una tabella che non rispettano più la logica di business o i requisiti del tuo sistema. Per esempio, devi cancellare i record degli studenti che hanno finito gli studi o che hanno, ehm, violato pesantemente le regole dell'università. Oppure, magari, devi pulire la tabella per lasciare solo le info aggiornate.

L'operazione di eliminazione dei dati viene usata nei seguenti scenari:

  • Eliminazione dei dati degli utenti che non sono più attivi.
  • Pulizia delle tabelle da record temporanei.
  • Eliminazione dei dati duplicati.
  • Eliminazione dei record vecchi secondo una certa logica di business.

Sintassi del comando DELETE

Per eliminare i dati usiamo il comando DELETE. Ecco la sua sintassi base:

DELETE FROM tabella
WHERE condizione;

Componenti principali:

  • DELETE FROM — la frase chiave che indica che vuoi eliminare righe da una tabella.
  • tabella — il nome della tabella da cui vuoi eliminare i dati.
  • WHERE condizione — la condizione per filtrare le righe da eliminare. Qui puoi usare qualsiasi operatore di confronto, operatori logici (AND, OR, NOT) e anche subquery.

Esempio: immaginiamo di avere una tabella students e vogliamo eliminare lo studente con ID = 5:

DELETE FROM students
WHERE id = 5;

Questa query eliminerà la riga dalla tabella students dove l'identificativo dello studente (colonna id) è uguale a 5.

Attenzione: se ti dimentichi di mettere la condizione WHERE, PostgreSQL eliminerà tutte le righe dalla tabella. Un errore del genere può essere catastrofico, soprattutto se sei in produzione.

Eliminare tutte le righe da una tabella

Se vuoi eliminare tutte le righe da una tabella, puoi scrivere la query senza la condizione WHERE. Per esempio:

DELETE FROM students;

Questa query eliminerà tutti i record dalla tabella students. Però la struttura della tabella rimane — non viene eliminata, solo svuotata.

Alternativa: TRUNCATE

Per eliminare tutte le righe da una tabella puoi anche usare il comando TRUNCATE. È più veloce di DELETE perché non registra ogni eliminazione nel transaction log. Esempio:

TRUNCATE TABLE students;

Differenze tra DELETE e TRUNCATE:

  • DELETE registra ogni eliminazione nel transaction log, così puoi fare rollback se serve.
  • TRUNCATE non supporta condizioni (WHERE) e non registra ogni eliminazione, quindi è più veloce ma meno flessibile.

Se vuoi solo svuotare la tabella, TRUNCATE è una bomba. Ma se ti serve eliminare solo una parte dei dati o vuoi poter annullare le modifiche, meglio DELETE.

Eliminare dati con condizioni complesse

Le condizioni di eliminazione in DELETE possono essere non solo semplici, ma anche complesse, con operatori logici (AND, OR, NOT) o anche subquery. Vediamo un esempio.

Esempio 1: Eliminare più record Eliminiamo tutti gli studenti che hanno più di 30 anni e che non hanno frequentato le lezioni negli ultimi 3 mesi:

DELETE FROM students
WHERE age > 30 AND last_attendance_date < (CURRENT_DATE - INTERVAL '3 months');

Questa query eliminerà solo gli studenti che rispettano entrambe le condizioni.

Esempio 2: Eliminazione usando una subquery

Supponiamo di avere una tabella failed_students dove ci sono gli ID degli studenti espulsi per scarso rendimento. Dobbiamo eliminarli dalla tabella principale students:

DELETE FROM students
WHERE id IN (SELECT student_id FROM failed_students);

Qui la subquery restituisce tutti gli ID degli studenti dalla tabella failed_students, e il comando DELETE elimina le righe corrispondenti dalla tabella students.

Consiglio

Prima di eliminare qualcosa scrivi una SELECT che mostra i dati che vuoi cancellare. Poi basta sostituire SELECT con DELETE e cancellerai le stesse righe che hai appena visto.

Esempio pratico

Immagina che uno studente con ID = 7 abbia deciso di cambiare università. Eliminiamo tutti i suoi dati dalla nostra tabella:

DELETE FROM students
WHERE id = 7;

Controlla la tabella dopo aver eseguito il comando per assicurarti che il record sia stato davvero eliminato:

SELECT * FROM students WHERE id = 7;

Se non ci sono più record con ID = 7, l'eliminazione è andata a buon fine.

Avvisi ed errori tipici

Sezione WHERE dimenticata

Uno degli errori più comuni con DELETE è dimenticare la sezione WHERE. Questo porta all'eliminazione di tutte le righe dalla tabella, che può essere davvero un disastro. Controlla sempre le tue query prima di lanciarle.

Esempio di situazione da dimenticanza:

DELETE FROM students;
-- Errore! Eliminazione di tutti gli studenti.

Per evitare questi errori, si consiglia di testare sempre la condizione WHERE con una SELECT prima di eseguire il comando DELETE. Per esempio:

SELECT * FROM students WHERE id = 5;

Se il risultato ti convince, allora puoi lanciare DELETE senza paura.

Eliminazione di dati collegati

Se la tabella ha delle foreign key (FOREIGN KEY), potresti ricevere un errore quando elimini i dati. Succede se la riga che vuoi eliminare è collegata ad altri record. Per esempio, se uno studente è iscritto a un corso nella tabella enrollments, PostgreSQL non ti farà eliminarlo dalla tabella students.

Per risolvere il problema puoi:

  1. Usare la cancellazione a cascata ON DELETE CASCADE quando crei la foreign key.
  2. Eliminare manualmente i record collegati prima di eliminare il record dalla tabella principale.

Esempio di eliminazione manuale dei dati collegati:

-- prima eliminiamo i dati dello studente 5 dalla tabella enrollments
DELETE FROM enrollments
WHERE student_id = 5;

-- poi eliminiamo lo studente 5 stesso
DELETE FROM students
WHERE id = 5;

Eliminazione con transazioni

Per operazioni di eliminazione critiche si consiglia di usare le transazioni. Così puoi annullare le modifiche in caso di errore.

Esempio di eliminazione in una transazione:

BEGIN;

DELETE FROM students
WHERE id = 42;

-- Controlliamo il risultato
SELECT * FROM students WHERE id = 42;

-- Se tutto ok, confermiamo le modifiche
COMMIT;

-- Se no, annulliamo
-- ROLLBACK;

Più info sulle transazioni nelle prossime lezioni :P

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