2 - Creazione e gestione tabelle
Questo modulo spiega tutto quello che serve per progettare e costruire schemi relazionali: creare database, dichiarare tabelle, scegliere tipi di dato (INT, VARCHAR, DATE, BOOLEAN), imporre vincoli, modificare strutture con ALTER TABLE, cancellare con DROP TABLE. Ogni concetto è corredato da esempi pratici e da consigli operativi e di deploy.
Nota: mostro esempi compatibili con MySQL / MariaDB e PostgreSQL quando ci sono differenze rilevanti. Le DDL sono in SQL standard ove possibile; per operazioni specifiche evidenzio la sintassi dialettale.
1) Creare un database
Sintassi di base
MySQL
PostgreSQL
Buone pratiche
-
specificare
IF NOT EXISTSper rendere idempotente la DDL; -
scegliere
utf8mb4(MySQL) oUTF8(Postgres) per supportare emoji e simboli; -
definire owner/permessi corretti.
2) CREATE TABLE — sintassi e componenti principali
Struttura tipica:
Tipi di dato principali (focus richiesto)
-
INT,BIGINT— interi (usaINTper id,BIGINTper contatori molto grandi).MySQL:INT~ 4 byte. -
VARCHAR(n)— stringa di lunghezza variabile (specifica un limiten); conserva spazio rispetto aCHAR. -
TEXT— testo lungo (quandoVARCHARnon basta). -
DATE— data (YYYY-MM-DD). -
TIMESTAMP/DATETIME— data+ora (attenzione a fusi orari: PostgresTIMESTAMP WITH TIME ZONEvsWITHOUT). -
BOOLEAN— vero/falso. In MySQL spessoTINYINT(1)è usato storicamente; MySQL 8 supporta aliasBOOLEAN. -
DECIMAL(p,s)— numeri decimali esatti (prezzo:DECIMAL(10,2)).
Scelta tipica per prezzi:
price DECIMAL(10,2)(massimo 8 cifre prima della virgola e 2 decimali).
3) Esempio completo di schema: ecommerce
Creiamo un piccolo schema con customers, products, orders, order_items.
Postgres (sintassi standard):
MySQL (note sulle differenze):
-
usare
INT AUTO_INCREMENTinvece diSERIAL/BIGSERIAL. -
definire engine
InnoDBper supporto FK:... ) ENGINE=InnoDB;
4) Vincoli (constraints) — cosa e perché
-
PRIMARY KEY — identifica univocamente la riga; crea implicitamente indice univoco.
-
UNIQUE — garanzia di unicità su una/e colonna/e.
-
NOT NULL — obbliga valore presente.
-
DEFAULT — valore di default quando
INSERTnon fornisce la colonna. -
CHECK (condizione) — validazione (Postgres applica sempre, MySQL la supporta pienamente solo da versioni recenti).
-
FOREIGN KEY — integrità referenziale (ON DELETE/ON UPDATE:
CASCADE,RESTRICT,SET NULL).
Esempio: vincolo CHECK
5) Indici e performance (breve ma pratico)
-
PRIMARY KEYeUNIQUEcreano indici automaticamente. -
creare indici aggiuntivi per colonne usate in
WHERE,JOIN,ORDER BY: -
evitare indici su colonne con pochi valori distinti (low cardinality) a meno che non siano parte di composite index.
6) ALTER TABLE — modificare tabelle in produzione
Operazioni comuni
-
Aggiungere colonna:
-
Aggiungere colonna con default e NOT NULL (procedura corretta):
-
aggiungi colonna nullable con default (veloce);
-
popoli i valori esistenti (se occorre);
-
imposti
NOT NULL.
-
-
Modificare tipo colonna:
-
Postgres:
-
MySQL:
-
-
Rinominare colonna:
-
Postgres:
ALTER TABLE table RENAME COLUMN old TO new; -
MySQL:
ALTER TABLE table CHANGE old new TIPO;(oRENAME COLUMNsu versioni recenti)
-
-
Aggiungere chiave esterna:
-
Rimuovere colonna / vincolo:
Cambiare schema su tabelle grandi: tecnica sicura
Per modifiche pesanti su tabelle molto grandi (ad es. cambiare tipo o aggiungere NOT NULL):
-
creare nuova colonna temporanea con il tipo desiderato;
-
eseguire
UPDATEin batch per popolare (evitando lock lunghi); -
verificare;
-
rinominare colonne (in transazione dove possibile) e rimuovere la vecchia.
7) DROP TABLE e cancellazione sicura
-
Sintassi:
-
Caveat:
-
DROP TABLEelimina struttura e dati. Usare con cautela. -
in Postgres:
DROP TABLE nome CASCADE;rimuove anche oggetti dipendenti (es. view, FK). Usare solo se si sa cosa si fa.
-
-
Consiglio operativo: in produzione, prima
RENAME TABLE orders TO orders_old;e solo dopo verificaDROP TABLE orders_old;.
8) Transazioni e DDL
-
Postgres: molte DDL (CREATE TABLE, ALTER TABLE, ...) sono transazionali — si possono fare
BEGIN; CREATE TABLE...; ROLLBACK;e annullare. -
MySQL: alcune operazioni DDL sono auto-commit e non sono reversibili con
ROLLBACK(dipende dalla versione e motore).Prudenza: eseguire DDL in finestre di manutenzione, fare backup.
9) Normalizzazione e scelta delle chiavi
-
1NF: colonne atomiche.
-
2NF/3NF: evitare ridondanze; separare entità distinte in tabelle correlate.
-
Chiavi surrogate (es.
idautoincrement) vs chiavi naturali (es.email): spesso si preferisce una PK surrogate e UNIQUE per chiavi naturali, perché è più flessibile per modifiche future.
10) Esempi pratici con dati e output simulato
Inserimenti (INSERT) e controllo struttura
Output atteso (tabella):
Visualizzare struttura tabella
-
MySQL
-
Postgres
11) Esercizi pratici (proposti con soluzione guida)
Esercizio 1 — Crea DB e tabella semplice
Crea database
library, tabellabooks(id, title, author, published DATE, pages INT, available BOOLEAN).
Soluzione (Postgres):
Esercizio 2 — Aggiungi colonna e imposta NOT NULL (su tabella esistente con dati)
Aggiungere
isbn VARCHAR(20)e poi assicurarsi che sia NOT NULL per le nuove righe.
Soluzione (sicura):
Esercizio 3 — Relazione 1:N (orders & customers)
Crea tabelle
customerseorderse una FK conON DELETE CASCADE.
Soluzione:
12) Checklist di deploy e sicurezza
-
fare backup (dump) prima di ALTER/DROP:
pg_dump,mysqldump; -
usare
IF EXISTSeIF NOT EXISTSper script idempotenti; -
testare DDL in ambiente di staging prima di produzione;
-
considerare
maintenance windowper modifiche che bloccano tabelle; -
monitorare locks:
SHOW PROCESSLIST(MySQL) /pg_locks(Postgres); -
limitare permessi: solo DBAs possono fare DDL; usare role/ruoli.
13) Riassunto pratico — comandi rapidi
-
Creare DB
-
MySQL:
CREATE DATABASE name CHARACTER SET utf8mb4; USE name; -
Postgres:
CREATE DATABASE name WITH ENCODING 'UTF8';
-
-
Creare tabella:
CREATE TABLE ...(...) -
Aggiungere colonna:
ALTER TABLE ... ADD COLUMN ...; -
Modificare colonna:
ALTER TABLE ... ALTER COLUMN ... TYPE ...;(Postgres) /MODIFY(MySQL) -
Aggiungere FK:
ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY ... -
Eliminare tabella:
DROP TABLE IF EXISTS name CASCADE;

Nessun commento:
Posta un commento