SQL DML: INSERT, UPDATE, DELETE e Transazioni
Come manipolare i dati senza distruggere il database: dal singolo inserimento alla gestione ACID
- Inserire record con INSERT INTO, sia in forma completa che abbreviata, anche con valori multipli
- Aggiornare dati con UPDATE … SET … WHERE e comprendere il rischio di omettere la clausola WHERE
- Eliminare righe con DELETE FROM … WHERE gestendo correttamente le Foreign Key
- Utilizzare le transazioni (BEGIN, COMMIT, ROLLBACK) per garantire l'atomicità delle operazioni
1. I comandi DML - Panoramica
Il Data Manipulation Language (DML) sono i comandi che agiscono sui dati dentro le tabelle già create. Non toccano la struttura — quello lo fa il DDL — ma inseriscono, modificano e cancellano righe. Io li chiamo "i tre verbi del quotidiano": aggiungere, cambiare, togliere.
| Comando | Cosa fa | Il mio consiglio |
|---|---|---|
| INSERT INTO | Aggiunge nuove righe | Crea, non sovrascrive mai |
| UPDATE … SET | Modifica righe esistenti | WHERE obbligatorio, sempre! |
| DELETE FROM | Rimuove righe | È transazionale, puoi fare rollback |
Io ho pensato di farvi vedere subito la differenza tra DDL e DML così: DDL è l'architetto che costruisce i muri, DML è chi ci vive dentro e sposta i mobili. Se sbagliate DDL, crolla la casa. Se sbagliate DML senza WHERE, svuotate la casa. Entrambi gravi, ma il secondo capita più spesso.
2. INSERT INTO
Ci sono due modi, ma io ne consiglio uno solo.
Io lo farei così: sempre forma completa con nomi colonne. So che è più lunga da scrivere, ma se domani aggiungo una colonna telefono alla tabella STUDENTE, la forma abbreviata si rompe tutta. La forma completa continua a funzionare. Io ho pensato di obbligarvi a usarla fin da ora proprio per questo, è una forma di protezione futura.
Dimenticare le virgolette singole per le stringhe e le date. In SQL le stringhe vanno con 'apice singolo', non con "doppio". 'Mario' giusto, "Mario" sbagliato in MySQL strict mode. E le date sempre in formato 'YYYY-MM-DD'.
3. UPDATE - Attenzione al WHERE
UPDATE modifica dati esistenti. Senza WHERE, modifica TUTTA la tabella. È il comando più pericoloso per un principiante.
Uno studente ha lanciato UPDATE STUDENTE SET password = '1234' senza WHERE sul database della simulazione aziendale. Ha resettato la password a 400 utenti. Io da allora insegno la regola d'oro: prima fai la SELECT con lo stesso WHERE, conti le righe, poi trasformi la SELECT in UPDATE. Io lo farei sempre così, anche quando siete esperti.
4. DELETE FROM
DELETE cancella righe, ma è transazionale: se siete dentro una transazione potete annullarlo. A differenza di TRUNCATE e DROP, rispetta le Foreign Key.
Ve lo ripeto perché io ho pensato di fissarvelo bene: DELETE è lento perché cancella riga per riga e scrive nel log per il rollback. TRUNCATE è velocissimo, svuota tutto senza log, resetta AUTO_INCREMENT, ma non potete annullarlo e non funziona se ci sono FK. Io uso DELETE quando devo essere selettivo (con WHERE), TRUNCATE solo per tabelle di test da azzerare completamente.
5. Transazioni ACID
Una transazione è un gruppo di operazioni che o vanno tutte a buon fine o nessuna. È come un bonifico: togli da un conto e metti in un altro, non puoi fare solo metà.
Atomicità: tutto o niente. Coerenza: il DB passa da uno stato valido a un altro valido. Isolamento: transazioni concorrenti non si disturbano. Durabilità: una volta COMMIT, i dati restano anche se salta la corrente.
6. SAVEPOINT - Rollback parziale
Se una transazione è lunga, potete creare punti di salvataggio intermedi. Io lo farei così quando avete importazioni complesse.
Immaginate di dover caricare 1000 studenti da CSV e poi aggiornare i loro corsi. Io farei: START TRANSACTION → ciclo di INSERT → SAVEPOINT dopo_import → UPDATE dei corsi → se UPDATE fallisce, ROLLBACK TO SAVEPOINT e ritento, senza perdere i 1000 INSERT già fatti. È un trucco che salva ore di lavoro.
📌 Riepilogo — Punti chiave
- INSERT INTO: usate sempre la forma con colonne esplicite, più robusta a future modifiche. Per più righe, un unico INSERT multiplo è più veloce.
- UPDATE senza WHERE: aggiorna tutte le righe. Prima di un UPDATE, verificate con una SELECT quante righe coinvolge. Regola d'oro che vi salva la carriera.
- DELETE: è transazionale (ROLLBACK possibile), rispetta FK. Usate CASCADE con cautela, RESTRICT per protezione.
- Transazioni ACID: START TRANSACTION → operazioni → COMMIT o ROLLBACK. Garantiscono atomicità, fondamentale per operazioni collegate.
- SAVEPOINT: permettono rollback parziali dentro una transazione lunga, utilissimi in importazioni complesse.
📚 Prossimo passo - SELECT di base
Ora che sappiamo inserire e modificare, nella prossima lezione impariamo a interrogare: SELECT, WHERE con operatori, ORDER BY, LIMIT e DISTINCT. È il cuore di SQL, quello che userete il 90% del tempo.
