SQL DML - INSERT UPDATE DELETE Transazioni | Programmazione Anno 4 Modulo 2 L07 | Prof. Giagnotti
Programmazione • Anno 5 • Modulo 2 • Lezione 2
Docente: Prof. Giagnotti

SQL DML: INSERT, UPDATE, DELETE e Transazioni

Come manipolare i dati senza distruggere il database: dal singolo inserimento alla gestione ACID

⏱ 50 min 📘 DML / TCL 🛠 Pratica + Sicurezza
🎯 Obiettivi di apprendimento
  • 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.

ComandoCosa faIl mio consiglio
INSERT INTOAggiunge nuove righeCrea, non sovrascrive mai
UPDATE … SETModifica righe esistentiWHERE obbligatorio, sempre!
DELETE FROMRimuove righeÈ transazionale, puoi fare rollback
💡 Come lo insegno io

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.

SQL - INSERT
-- ① FORMA COMPLETA (consigliata): elenchi le colonne esplicitamente INSERT INTO STUDENTE (nome, cognome, email, data_nascita) VALUES ('Mario', 'Rossi', 'mario.rossi@scuola.it', '2006-05-10');-- ② FORMA ABBREVIATA (sconsigliata): dipende dall'ordine delle colonne in tabella INSERT INTO STUDENTE VALUES (NULL, 'Mario', 'Rossi', 'mario.rossi@scuola.it', '2006-05-10', NULL);-- ③ INSERIMENTO MULTIPLO: una sola query, più veloce INSERT INTO CORSO (titolo, crediti, docente) VALUES ('Basi di Dati', 9, 'Giagnotti'), ('Programmazione Web', 6, 'Giagnotti'), ('Reti', 6, 'Bianchi');-- ④ INSERT da SELECT: copi da un'altra tabella INSERT INTO STUDENTE_ARCHIVIO (nome, cognome, email) SELECT nome, cognome, email FROM STUDENTE WHERE data_nascita < '2000-01-01';
🎯 Tip del docente - Il mio metodo

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.

⚠️ Errore comune

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.

SQL - UPDATE
-- Aggiorno UN solo studente UPDATE STUDENTE SET email = 'mario.new@scuola.it' WHERE matricola = 1;-- Aggiorno più colonne insieme UPDATE STUDENTE SET nome = 'Maria', media = 28.5 WHERE matricola = 2;-- ATTENZIONE: senza WHERE aggiorna TUTTI! -- UPDATE STUDENTE SET media = 30; -- MAI fare così in produzione!-- Trucco sicuro che insegno io: prima SELECT, poi UPDATE -- 1) Verifico quante righe tocco: SELECT * FROM STUDENTE WHERE cognome = 'Rossi'; -- 2) Se sono giuste, allora aggiorno: UPDATE STUDENTE SET media = media + 1 WHERE cognome = 'Rossi';
⚠️ Errore che ho visto fare davvero

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.

SQL - DELETE
-- Cancello uno studente specifico DELETE FROM STUDENTE WHERE matricola = 5;-- Cancello con condizione complessa DELETE FROM ESAME WHERE voto < 18 AND data_esame < '2024-01-01';-- DELETE rispetta FK: se studente ha esami con RESTRICT, fallisce -- Se ha CASCADE, cancella anche gli esami collegati (attenzione!)-- Conto prima di cancellare (metodo sicuro) SELECT COUNT(*) FROM ESAME WHERE voto < 18; -- Se il numero torna, cancello DELETE FROM ESAME WHERE voto < 18;
💡 Tip - DELETE vs TRUNCATE vs DROP

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à.

📘 ACID - Da ricordare all'esame

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.

SQL - TRANSAZIONE COMPLETA
START TRANSACTION; -- o BEGIN;-- Trasferisco 6 crediti da uno studente all'altro (esempio didattico) UPDATE STUDENTE SET crediti = crediti - 6 WHERE matricola = 1; UPDATE STUDENTE SET crediti = crediti + 6 WHERE matricola = 2;-- Se tutto ok, rendo definitivo COMMIT;-- Se qualcosa va storto -- ROLLBACK; -- annulla tutto, torna allo stato prima di START
FLUSSO TRANSAZIONE
START TRANSACTION → punto di ripristino creato ↓ UPDATE / INSERT / DELETE → operazioni in memoria, non ancora su disco ↓ ┌─ COMMIT → scrittura permanente su disco ✓ └─ ROLLBACK → annullamento totale, DB invariato ✗

6. SAVEPOINT - Rollback parziale

Se una transazione è lunga, potete creare punti di salvataggio intermedi. Io lo farei così quando avete importazioni complesse.

SQL - SAVEPOINT
START TRANSACTION;INSERT INTO STUDENTE (nome, cognome) VALUES ('Test', 'Utente'); SAVEPOINT dopo_insert; -- punto di ripristino parzialeUPDATE ESAME SET voto = 0; -- ops! senza WHERE, errore!ROLLBACK TO SAVEPOINT dopo_insert; -- torno al savepoint: INSERT ok, UPDATE annullatoCOMMIT; -- salvo solo l'INSERT
🔧 Esempio pratico - Come lo gestirei io

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.

  • 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.