Leçons du module (3/4)
Créer des tables et des contraintes : DDL
Jusqu'à présent, vous avez travaillé sur des tables qui existent déjà (customers,
orders…). DDL (« Data Definition Language ») fait référence aux instructions qui
créer et modifier le schéma lui-même : tables, colonnes, contraintes,
index.
CREATE TABLE : la syntaxe
CREATE TABLE nome_tabella (
colonna TIPO [vincoli_colonna],
…,
[vincoli_tabella]
);Exemple : une liste de souhaits qui relie les clients et les produits :
CREATE TABLE wishlists (
id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id),
product_id INTEGER NOT NULL REFERENCES products(id),
added_on DATE NOT NULL DEFAULT CURRENT_DATE,
note TEXT,
UNIQUE (customer_id, product_id)
);Décomposons-le morceau par morceau.
Les types les plus courants
| Tapez | Ce qu'il contient |
|---|---|
INTEGER / INT | Nombres entiers (-2,1B … +2,1B) |
BIGINT | Grands entiers |
NUMERIC(p, s) | Décimales exactes — argent, pourcentages |
TEXT | Chaînes de longueur variable |
VARCHAR(n) | Chaînes d'une longueur maximale de n |
BOOLEAN | TRUE / FALSE / INT0 |
INT1 | Dates uniquement |
INT2 | Date + heure (pas de fuseau horaire) |
INT3 | Date + heure avec fuseau horaire |
INT4 | INT5 avec séquence auto-incrémentée |
Contraintes
Une contrainte est une règle que PostgreSQL applique automatiquement : si un
INSERT/UPDATE le viole, l'opération échoue.
PRIMARY KEY -- identifica univocamente la riga, non NULL
NOT NULL -- vieta NULL
UNIQUE -- vieta duplicati su questa colonna
REFERENCES tabella(colonna) -- foreign key
CHECK (espressione_booleana) -- es. CHECK (price > 0)
DEFAULT espressione -- valore di default se non fornitoLes contraintes peuvent être déclarées en ligne sur une colonne ou au niveau de la table
contraintes** (sous les champs). Exemple de UNIQUE composite :
UNIQUE (customer_id, product_id) -- niente coppia (cliente, prodotto) duplicataContrainte CHECK
CHECK applique une règle personnalisée :
CREATE TABLE stock_alerts (
product_id INTEGER PRIMARY KEY REFERENCES products(id),
threshold INTEGER NOT NULL CHECK (threshold >= 0),
notify_email TEXT NOT NULL,
active BOOLEAN NOT NULL DEFAULT true
);threshold doit être ≥ 0 ; si quelqu'un essaie INSERT … threshold = -5, il
échoue avec une erreur de contrainte.
Suppression et modification
DROP TABLE wishlists; -- elimina la tabella (e i dati!)
DROP TABLE IF EXISTS wishlists; -- senza errore se non esiste
ALTER TABLE customers ADD COLUMN newsletter BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE customers DROP COLUMN newsletter;A ton tour
Créez un tableau de listes de souhaits avec les colonnes suivantes : id (SERIAL PRIMARY KEY), customer_id (INTEGER NOT NULL REFERENCES customer(id)), product_id (INTEGER NOT NULL REFERENCES products(id)), add_on (DATE NOT NULL avec DEFAULT CURRENT_DATE). Ajoutez une contrainte UNIQUE sur la paire (customer_id, product_id).
Afficher l'indice
UNIQUE (customer_id, product_id) comme contrainte au niveau de la table en bas.
Solution disponible après 3 tentatives
Exercice de révision
Ajoutez à la table clients une colonne newsletter de type BOOLEAN, NOT NULL, avec DEFAULT false. Utilisez une seule instruction ALTER TABLE.
Afficher l'indice
Sans DEFAULT, ALTER échouerait car des lignes existent déjà et la nouvelle colonne n'est PAS NULL.
Solution disponible après 3 tentatives