Créer des tables
Ce que tu vas apprendre
- Créer une table avec
CREATE TABLEet 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
| Type | Contenu | Exemple |
|---|---|---|
integer | nombre entier | 35 |
bigint | grand nombre entier | 9000000000 |
numeric | nombre décimal exact | 1.5 |
text | texte de longueur libre | 'Tarte' |
boolean | vrai ou faux | true |
date | une date | '2026-11-13' |
timestamptz | date et heure avec fuseau horaire | now() |
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.
| Contrainte | Règle |
|---|---|
PRIMARY KEY | valeur unique et obligatoire, identifie la ligne |
NOT NULL | la colonne ne peut pas rester vide |
UNIQUE | pas deux fois la même valeur |
CHECK (condition) | une condition sur la valeur |
DEFAULT valeur | valeur 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.
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 TABLEdécrit les colonnes, leur type et leurs contraintes.GENERATED ALWAYS AS IDENTITY PRIMARY KEYdonne unidnumé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 CASCADEsupprime les lignes liées ;DROP TABLEsupprime toute la table, sans retour.
Pour aller plus loin
Sources officielles
Ensuite
Ajouter, modifier et supprimer des lignes
Écrire dans une base avec INSERT, UPDATE et DELETE, et comprendre pourquoi oublier le WHERE peut tout effacer.
Les jointures
Combiner plusieurs tables dans une seule requête avec INNER JOIN et LEFT JOIN, et utiliser des alias pour garder des requêtes lisibles.
- Projet
- Lignes de code
- Niveau
- Cave
- Appartement
- SQL
- Pièce
- 3/7
- Plan n°
- sql/03.creer-des-tables