Comandi DML: manipolare i dati

// 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
📄
Slides
DML completo, diagrammi transazioni, tabella rischi
Scarica →

1. I Comandi DML

Il Data Manipulation Language (DML) comprende i comandi per agire sui dati all’interno delle tabelle già esistenti. Non cambia la struttura (quello è DDL), ma inserisce, modifica e cancella righe.

INSERT INTO
Aggiunge nuove righe a una tabella. Puoi inserire una riga alla volta o più righe in un’unica istruzione.
Crea → non sovrascrive mai
UPDATE … SET
Modifica i valori di righe esistenti. La clausola WHERE limita quali righe vengono aggiornate. Senza WHERE: aggiorna tutto!
Modifica → WHERE obbligatorio
DELETE FROM
Rimuove righe da una tabella. Come UPDATE, richiede sempre WHERE. È transazionale: puoi fare ROLLBACK.
Cancella → transazionale

2. INSERT INTO

Sintassi base e varianti

-- ① FORMA COMPLETA (consigliata): elenchi le colonne esplicitamente
-- Vantaggi: sicura rispetto ad ALTER TABLE, leggibile, indipendente dall'ordine
INSERT INTO STUDENTE (nome, cognome, email, data_nascita)
VALUES ('Marco', 'Rossi', 'marco.rossi@scuola.it', '2007-03-15');

-- ② FORMA ABBREVIATA: nessun elenco colonne → ordine uguale a CREATE TABLE
-- Rischiosa: se cambia la struttura, si rompe tutto
INSERT INTO STUDENTE
VALUES (NULL, 'Laura', 'Bianchi', 'laura.b@scuola.it', '2006-11-22', TRUE);

-- ③ INSERT MULTIPLO: più righe in un'unica istruzione — molto più efficiente
INSERT INTO CORSO (nome_corso, crediti, docente)
VALUES
    ('Programmazione',   6,  'Prof. Giagnotti'),
    ('Matematica',        5,  'Prof. Verdi'),
    ('Inglese Tecnico',   3,  'Prof. Smith'),
    ('Sistemi e Reti',    6,  'Prof. Giagnotti');

Popolazione completa del database scuola

-- Inserimento studenti
INSERT INTO STUDENTE (nome, cognome, email, data_nascita) VALUES
    ('Marco',    'Rossi',    'marco.rossi@scuola.it',    '2007-03-15'),
    ('Laura',    'Bianchi',  'laura.b@scuola.it',        '2006-11-22'),
    ('Ahmed',    'Karim',    'ahmed.k@scuola.it',        '2007-07-08'),
    ('Sofia',    'Ferrari',  'sofia.f@scuola.it',        '2006-05-30'),
    ('Luca',     'Conti',    'luca.c@scuola.it',         '2007-01-14');

-- Inserimento esami (tabella giunzione con attributi)
INSERT INTO ESAME (id_studente, id_corso, voto, data_esame) VALUES
    (1, 1, 28, '2026-02-10'),   -- Marco → Programmazione
    (1, 2, 25, '2026-02-14'),   -- Marco → Matematica
    (2, 1, 30, '2026-02-10'),   -- Laura → Programmazione
    (3, 3, 22, '2026-02-18'),   -- Ahmed → Inglese
    (4, 4, 27, '2026-02-20');   -- Sofia → Sistemi
// stato delle tabelle dopo gli INSERT
STUDENTE
id_studentenomecognomeemaildata_nascitaattivo
1MarcoRossimarco.rossi@scuola.it2007-03-15TRUE
2LauraBianchilaura.b@scuola.it2006-11-22TRUE
3AhmedKarimahmed.k@scuola.it2007-07-08TRUE
4SofiaFerrarisofia.f@scuola.it2006-05-30TRUE
5LucaContiluca.c@scuola.it2007-01-14TRUE
ESAME
id_esameid_studente (FK)id_corso (FK)votodata_esame
111282026-02-10
212252026-02-14
321302026-02-10
433222026-02-18
544272026-02-20

3. UPDATE — Modificare i Dati

-- Sintassi completa
UPDATE nome_tabella
SET   colonna1 = valore1, colonna2 = valore2, ...
WHERE condizione;

-- ① Correzione di un voto: lo studente 1 ha sostenuto una revisione
UPDATE ESAME
SET    voto = 29
WHERE  id_esame = 1;

-- ② Aggiornare più colonne insieme
UPDATE STUDENTE
SET    nome = 'Alessandro', email = 'alex.rossi@scuola.it'
WHERE  id_studente = 1;

-- ③ Espressioni aritmetiche: aumenta i crediti di Programmazione
UPDATE CORSO
SET    crediti = crediti + 1
WHERE  nome_corso = 'Programmazione';
🚨 PERICOLO — UPDATE SENZA WHERE
// ❌ SBAGLIATO — aggiorna TUTTI i voti!
UPDATE ESAME
SET voto = 18;
-- Risultato: 2000 studenti
-- tutti con voto 18... 😱
// ✓ CORRETTO — solo chi serve
UPDATE ESAME
SET   voto = 18
WHERE id_esame = 42;
-- Solo Marco, solo
-- quell'esame. ✓

💡 Trucco professionale: prima di fare un UPDATE controverso, esegui una SELECT con la stessa WHERE per vedere quante righe verranno modificate.

4. DELETE FROM — Eliminare Righe

-- Sintassi
DELETE FROM nome_tabella
WHERE condizione;

-- ① Eliminare un singolo esame
DELETE FROM ESAME
WHERE id_esame = 4;

-- ② Eliminare tutti gli esami di uno studente
DELETE FROM ESAME
WHERE id_studente = 3;

-- ③ Eliminare uno studente
-- Se la FK ha ON DELETE CASCADE → elimina automaticamente anche i suoi esami
-- Se la FK ha ON DELETE RESTRICT → ERRORE se ha esami associati (protegge da perdita dati)
DELETE FROM STUDENTE
WHERE id_studente = 3;
// effetto di ON DELETE CASCADE — cosa succede quando elimini Ahmed (id=3)
STUDENTE
id=1 Marco Rossi
id=2 Laura Bianchi
id=3 Ahmed Karim ← DELETE
id=4 Sofia Ferrari
CASCADE
ESAME
id=1 studente=1 corso=1 voto=28
id=2 studente=1 corso=2 voto=25
id=3 studente=2 corso=1 voto=30
id=4 studente=3 ← auto-DELETE
id=5 studente=4 corso=4 voto=27

5. Transazioni — Atomicità e Sicurezza

Una transazione è un insieme di operazioni SQL che vengono eseguite come un blocco atomico: o vengono completate tutte, oppure non viene applicata nessuna. Questo garantisce la consistenza del database anche in caso di errori o crash.

// proprietà ACID
A
Atomicità
Tutto o niente. Nessuna operazione parziale.
C
Consistenza
Il DB passa da uno stato valido a un altro valido.
I
Isolamento
Le transazioni concorrenti non si interferiscono.
D
Durabilità
I dati committati persistono anche dopo un crash.

Esempio pratico: trasferimento voto con transazione

-- Scenario: vogliamo correggere il voto e aggiornare una nota nello stesso momento
-- Se una delle due operazioni fallisce, NON vogliamo che l'altra venga applicata

START TRANSACTION;

-- Operazione 1: correggi il voto
UPDATE ESAME
SET   voto = 27, data_esame = '2026-03-01'
WHERE id_esame = 2;

-- Operazione 2: inserisci una nota di revisione (in una tabella NOTE ipotetica)
INSERT INTO NOTE_ESAME (id_esame, testo, data)
VALUES (2, 'Revisione del 2026-03-01 — accettata', NOW());

-- Se arriviamo qui senza errori: conferma entrambe le operazioni
COMMIT;

-- ------
-- Se invece c'è stato un errore (es. in un programma Python col try/except):
ROLLBACK;  -- annulla TUTTO — il DB torna com'era prima dello START TRANSACTION
// timeline di una transazione
START TRANSACTION → inizia il “punto di ripristino”
UPDATE / INSERT / DELETE → operazioni in memoria (non ancora su disco)
COMMIT
Scrittura su disco permanente ✓
ROLLBACK
Annullamento totale — DB invariato ✗

SAVEPOINT — Punti intermedi nella transazione

START TRANSACTION;

INSERT INTO STUDENTE (nome, cognome) VALUES ('Test', 'Utente');

SAVEPOINT dopo_insert;  -- punto di ripristino parziale

UPDATE ESAME SET voto = 0;  -- ops! senza WHERE

ROLLBACK TO SAVEPOINT dopo_insert;  -- torna al savepoint: INSERT ok, UPDATE annullato

COMMIT;  -- salva solo l'INSERT
📌 Riepilogo — Punti chiave
  • INSERT INTO: usa sempre la forma con colonne esplicite — più robusta a future modifiche della struttura.
  • UPDATE senza WHERE: aggiorna tutte le righe. Prima di eseguire un UPDATE, verifica con una SELECT quante righe coinvolge.
  • DELETE: è transazionale (può fare ROLLBACK). Rispetta i vincoli FK: usa CASCADE se vuoi eliminare a cascata, RESTRICT se vuoi protezione.
  • Le transazioni garantiscono atomicità (ACID): usa START TRANSACTION → operazioni → COMMIT o ROLLBACK.
  • I SAVEPOINT permettono rollback parziali all’interno di una transazione lunga.

Lascia un commento