Passer au contenu principal
eLearner.app
Module 8 · Leçon 3 sur 431/57 dans le cours~12 min
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

SQL
CREATE TABLE nome_tabella (
  colonna  TIPO  [vincoli_colonna],
  …,
  [vincoli_tabella]
);

Exemple : une liste de souhaits qui relie les clients et les produits :

SQL
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

TapezCe qu'il contient
INTEGER / INTNombres entiers (-2,1B … +2,1B)
BIGINTGrands entiers
NUMERIC(p, s)Décimales exactes — argent, pourcentages
TEXTChaînes de longueur variable
VARCHAR(n)Chaînes d'une longueur maximale de n
BOOLEANTRUE / FALSE / INT0
INT1Dates uniquement
INT2Date + heure (pas de fuseau horaire)
INT3Date + heure avec fuseau horaire
INT4INT5 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.

SQL
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 fornito

Les 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 :

SQL
UNIQUE (customer_id, product_id)   -- niente coppia (cliente, prodotto) duplicata

Contrainte CHECK

CHECK applique une règle personnalisée :

SQL
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

SQL
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

Exercice#sql.m8.l3.e1
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
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

Exercice#sql.m8.l3.e2
Tentatives : 0Chargement…

Ajoutez à la table clients une colonne newsletter de type BOOLEAN, NOT NULL, avec DEFAULT false. Utilisez une seule instruction ALTER TABLE.

Chargement de l'éditeur…
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