CaveSQL SQLPièce 3/7Débutant

Créer des tables

Définir ses propres tables avec CREATE TABLE, choisir les types, poser des contraintes et relier les tables par des clés étrangères.

Ce que tu vas apprendre

  • Créer une table avec CREATE TABLE et choisir le type de chaque colonne.
  • Protéger tes données avec des contraintes : clé primaire, NOT NULL, UNIQUE, CHECK.
  • Relier deux tables avec une clé étrangère.

CREATE TABLE

Commence par la table la plus simple de notre site :

CREATE TABLE categories (
  id   bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  nom  text NOT NULL UNIQUE
);

Chaque ligne entre parenthèses décrit une colonne : son nom, son type (le genre de valeur qu'elle accepte), puis ses contraintes.

GENERATED ALWAYS AS IDENTITY demande à PostgreSQL de numéroter lui-même les lignes : 1, 2, 3... Tu n'as plus à fournir l'id dans tes INSERT.

Les types courants

TypeContenuExemple
integernombre entier35
bigintgrand nombre entier9000000000
numericnombre décimal exact1.5
texttexte de longueur libre'Tarte'
booleanvrai ou fauxtrue
dateune date'2026-11-13'
timestamptzdate et heure avec fuseau horairenow()

Dans le doute pour un texte, text convient très bien dans PostgreSQL.

Les contraintes

Une contrainte est une règle que la base fait respecter. Si une ligne la viole, PostgreSQL refuse l'ajout ou la modification avec une erreur.

ContrainteRègle
PRIMARY KEYvaleur unique et obligatoire, identifie la ligne
NOT NULLla colonne ne peut pas rester vide
UNIQUEpas deux fois la même valeur
CHECK (condition)une condition sur la valeur
DEFAULT valeurvaleur prise si on n'en donne pas

La base est ton dernier rempart. Même si ton application oublie de vérifier une donnée, la contrainte la bloque.

Une clé étrangère pour relier les tables

Une recette appartient à une catégorie. On ne recopie pas le nom de la catégorie dans chaque recette : on stocke son id.

CREATE TABLE recettes (
  id             bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  titre          text NOT NULL,
  temps_minutes  integer CHECK (temps_minutes > 0),
  categorie_id   bigint REFERENCES categories (id),
  cree_le        timestamptz NOT NULL DEFAULT now()
);

REFERENCES categories (id) crée une clé étrangère : la colonne categorie_id doit contenir un id qui existe dans categories.

Une catégorie inconnue est donc refusée. Et PostgreSQL empêche aussi de supprimer une catégorie encore utilisée par une recette.

Une table pour les ingrédients

Une recette a plusieurs ingrédients. La table ingredients pointe vers sa recette :

CREATE TABLE ingredients (
  id          bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  recette_id  bigint NOT NULL REFERENCES recettes (id) ON DELETE CASCADE,
  nom         text NOT NULL,
  quantite    numeric,
  unite       text
);

ON DELETE CASCADE précise ce qui arrive quand la recette est supprimée : ses ingrédients sont supprimés avec elle. Sans cette option, la suppression serait refusée tant qu'il reste des ingrédients.

Le lien entre recettes et ingredients est de type « un vers plusieurs » : une recette, plusieurs ingrédients. La clé étrangère se place toujours du côté « plusieurs ».

Tester les contraintes

Essaie ces deux requêtes, elles échouent volontairement :

INSERT INTO recettes (titre, temps_minutes) VALUES ('Soupe', -5);
INSERT INTO recettes (titre, categorie_id) VALUES ('Soupe', 999);

La première viole le CHECK (durée négative). La seconde viole la clé étrangère (la catégorie 999 n'existe pas). Lis le message d'erreur : il nomme la contrainte en cause.

Modifier ou supprimer une table

ALTER TABLE recettes ADD COLUMN vegetarienne boolean NOT NULL DEFAULT false;
DROP TABLE ingredients;

ALTER TABLE change la structure d'une table existante. DROP TABLE la supprime avec toutes ses données.

DROP TABLE est définitif, comme un DELETE sans WHERE. Vérifie le nom de la table avant d'exécuter la commande.

À retenir

  • CREATE TABLE décrit les colonnes, leur type et leurs contraintes.
  • GENERATED ALWAYS AS IDENTITY PRIMARY KEY donne un id numéroté automatiquement.
  • Les contraintes (NOT NULL, UNIQUE, CHECK, DEFAULT) font respecter des règles par la base elle-même.
  • Une clé étrangère (REFERENCES) relie deux tables et interdit les liens vers une ligne inexistante.
  • ON DELETE CASCADE supprime les lignes liées ; DROP TABLE supprime toute la table, sans retour.

Pour aller plus loin

Sources officielles

Ensuite

Projet
Lignes de code
Niveau
Cave
Appartement
SQL
Pièce
3/7
Plan n°
sql/03.creer-des-tables
Lignes de code · fiches rédigées à partir des documentations officielles, sources citées en bas de chaque page.