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.
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:
| id | nome | |
| 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à:
| id | nome | |
| 1 | Mario | [email protected] |
| 2 | Luigi | [email protected] |
| 4 | Paolo | [email protected] |
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).
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.
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.
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 è 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:
sessioni è completamente vuota.id = 1 (il contatore AUTO_INCREMENT viene azzerato).