logo logo Dove iniziare Linguaggi Aiuto Blog
Home Dove iniziare Linguaggi Aiuto e Supporto Biadets Blog

Eliminare dati in MySQL

Dopo aver imparato a inserire e leggere i dati, è importante sapere come eliminarli dal database. In MySQL, l'istruzione DELETE permette di rimuovere righe dalle tabelle in modo permanente.

Con Node.js possiamo eseguire query DELETE per rimuovere righe specifiche o intere sezioni di dati, ad esempio per eliminare un utente cancellato, rimuovere prodotti obsoleti o pulire vecchi log.

La query DELETE base

L'istruzione DELETE è usata per rimuovere righe da una tabella. A differenza dell'istruzione UPDATE, che modifica i dati esistenti e che vedremo nella lezione su UPDATE, l'eliminazione rimuove completamente i record dal database. La sintassi base prevede di specificare da quale tabella eliminare e quali righe rimuovere.

Immaginiamo di avere una tabella utenti con questi dati:

idnomeemail
1 Mario [email protected]
2 Luigi[email protected]
3 Anna[email protected]
4 Paolo[email protected]

Vogliamo eliminare l'utente con id = 3 (ovvero Anna). Ecco come fare:

const sql = "DELETE FROM utenti WHERE id = 3";
  
con.query(sql, function (err, result) {
  if (err) throw err;
  console.log("Utente eliminato");
});

Dopo l'esecuzione, la tabella conterrà:

idnomeemail
1 Mario [email protected]
2 Luigi[email protected]
4 Paolo[email protected]

L'oggetto result

Quando eseguiamo una query DELETE, l'oggetto result contiene informazioni utili:

con.query(sql, function (err, result) {
  if (err) throw err;
  console.log("Utenti eliminati: " + result.affectedRows);
});

La proprietà result.affectedRows, restituita dal modulo MySQL di Node.js, indica quante righe sono state eliminate. Nell'esempio sopra, result.affectedRows sarà 1 perché abbiamo eliminato un solo utente. Se il valore è 0, significa che nessuna riga corrispondeva ai criteri specificati (ad esempio, se non esisteva un utente con id = 3).

Eliminare più righe

Possiamo eliminare più righe contemporaneamente utilizzando una condizione nella clausola WHERE.

Ad esempio, possiamo eliminare tutti gli utenti inattivi:

const sql = "DELETE FROM utenti WHERE attivo = 0";

con.query(sql, function (err, result) {
  if (err) throw err;
  console.log(result.affectedRows + " utenti eliminati");
});

Nell'esempio, vengono eliminati tutti gli utenti che in corrispondenza della colonna attivo hanno 0.

Usare parametri nelle query DELETE

Come per le altre query, è essenziale usare parametri preparati quando i valori provengono dall'utente, per prevenire SQL injection.

Facciamo un esempio: un utente del sito web clicca su "Elimina il mio account". L'ID dell'utente (ad esempio, 5) viene inviato al server.

// Questo valore potrebbe provenire da un form o da una richiesta HTTP
const idDaEliminare = 5;

// Usiamo ? come placeholder
const sql = "DELETE FROM utenti WHERE id = ?";

con.query(sql, [idDaEliminare], function (err, result) {
  if (err) throw err;
  
  if (result.affectedRows > 0) {
    console.log("Utente eliminato con successo");
  } else {
    console.log("Nessun utente trovato con questo ID");
  }
});

MySQL sostituisce automaticamente il ? con il valore 5, proteggendo da attacchi SQL injection. Senza parametri preparati, un utente malintenzionato potrebbe inserire codice SQL dannoso.

Eliminare tutta la tabella

Per eliminare tutti i record da una tabella, si usa DELETE senza clausola WHERE. Questa operazione è irreversibile e va usata con estrema cautela.

const sql = "DELETE FROM log";

con.query(sql, function (err, result) {
  if (err) throw err;
  console.log("Tutti i log sono stati eliminati: " + result.affectedRows + " record");
});

Dopo l'esecuzione, la tabella log esiste ancora ma non contiene più alcuna riga. La struttura della tabella (colonne e tipi di dato) rimane invariata.

L'istruzione TRUNCATE

L'istruzione TRUNCATE è un'alternativa a DELETE per svuotare completamente una tabella. Rimuove tutti i record in modo molto più veloce rispetto a DELETE, ma ha alcune differenze importanti.

Caratteristica DELETE TRUNCATE
Velocità Più lento, elimina riga per riga Molto più veloce
Clausola WHERE Può essere usata per eliminare righe specifiche Non supportata, elimina tutto
AUTO_INCREMENT Il contatore non viene azzerato Il contatore viene azzerato

Supponiamo di avere una tabella sessioni che registra i login temporanei, e vogliamo svuotare la tabella ogni mese.

Possiamo eseguire questo codice Node.js:

const sql = "TRUNCATE TABLE sessioni";

con.query(sql, function (err, result) {
  if (err) throw err;
  console.log("Tabella svuotata completamente");
  console.log("Operazione completata");
});

Dopo l'esecuzione:

  • La tabella sessioni è completamente vuota.
  • La struttura della tabella, con le colonne, rimane intatta.
  • La prossima riga inserita avrà id = 1 (il contatore AUTO_INCREMENT viene azzerato).

Prova!Completa gli spazi vuoti con il testo appropriato.
// Elimina un utente con ID specifico
const sql = " FROM utenti id = 5";

Prova!Scegli l'opzione corretta tra quelle elencate.
// Quale proprietà indica quante righe sono state eliminate?
con.query(sql, function (err, result) {
  console.log(____);
});