Aller au contenu
M06 · C. Manipuler les données

Les contraintes d'intégrité

Protéger les données avec PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE, DEFAULT et CHECK, et comprendre l'intégrité référentielle (ON DELETE).

1Situer

Dans l'ancien tableau Excel de Souk Atlas, on trouvait de tout : des commandes pour un client qui n'existe plus, des prix négatifs, deux clients avec le même email. Une base bien construite refuse ces erreurs toute seule : ce sont les contraintes d'intégrité, les règles de gestion écrites directement dans les tables.

2Comprendre

La clé étrangère protège les liens entre tables
clients 1 · Amina 2 · Youssef 3 · Salma commandes (client_id 🔗) cmd 1 · client_id 1 cmd 3 · client_id 1 cmd 13 · client_id 2 ✔ cmd 14 · client_id 99 ✖ ? DELETE FROM clients WHERE id = 1; ✖ refusé : 2 commandes font encore référence à Amina FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE -- ou SET NULL, RESTRICT

commandes.client_id est une clé étrangère : elle doit contenir l'id d'un client qui existe.

1 / 5

Clé primaire, NOT NULL, UNIQUE, DEFAULT

ContrainteElle interditExemple
PRIMARY KEYles doublons et le vide sur l’identifiantid INT AUTO_INCREMENT PRIMARY KEY
NOT NULLla case videnom VARCHAR(50) NOT NULL
UNIQUEdeux lignes avec la même valeuremail VARCHAR(100) UNIQUE
DEFAULTrien : elle donne une valeur si on n’en fournit passtock INT DEFAULT 0
CHECKles valeurs qui ne respectent pas une conditionCHECK (prix > 0)

La contrainte de domaine CHECK

age INT CHECK (age BETWEEN 15 AND 60),
statut VARCHAR(12) CHECK (statut IN ('en attente', 'payée', 'livrée', 'annulée')),
email VARCHAR(100) CHECK (email LIKE '%_@_%._%'),
CONSTRAINT ck_dates CHECK (date_retour >= date_emprunt)

Clé étrangère et intégrité référentielle

CREATE TABLE commandes (
  id INT AUTO_INCREMENT PRIMARY KEY,
  client_id INT NOT NULL,
  date_commande DATE NOT NULL,
  FOREIGN KEY (client_id) REFERENCES clients(id)
    ON DELETE RESTRICT      -- refuse de supprimer un client qui a des commandes
);
OptionSi on supprime la ligne « parent »…
ON DELETE RESTRICT (par défaut)la suppression est refusée
ON DELETE CASCADEles lignes « enfants » sont supprimées aussi
ON DELETE SET NULLla clé étrangère des enfants passe à NULL

Ajouter ou retirer une contrainte

Une contrainte peut recevoir un nom (CONSTRAINT nom ...) pour être retirée plus tard :

ALTER TABLE produits ADD CONSTRAINT ck_stock CHECK (stock >= 0);
ALTER TABLE clients ADD CONSTRAINT fk_ville FOREIGN KEY (ville_id) REFERENCES villes(id);
ALTER TABLE produits DROP CHECK ck_stock;
ALTER TABLE clients DROP FOREIGN KEY fk_ville;
Exemple simple

Le videur à l'entrée

Une contrainte est un videur à l'entrée de la table : la ligne qui ne respecte pas la règle ne rentre pas, et MySQL explique pourquoi.

prix DECIMAL(8,2) NOT NULL CHECK (prix > 0)
INSERT ... prix = -20  → refusé
Exemple simple

La clé étrangère, c'est la réservation

On ne peut pas réserver la chambre 512 d'un hôtel qui n'a que 300 chambres. De même, une commande ne peut pas pointer vers le client 999 s'il n'existe pas.

3Manipuler

La base de la boutique est chargée. Chaque instruction ci-dessous viole une contrainte : exécutez, lisez les messages, puis corrigez chaque instruction pour qu'elle passe.
Pas à pas dans le lab ↗ La base de départ se crée dans votre navigateur (moteur SQL d’environ 700 Ko, chargé une fois).
Résultat

Le résultat de chaque requête s'affichera ici.

Consignes 0 / 4

  1. La lanterne en cuivre est ajoutée, avec un prix
  2. Le plateau est ajouté avec un prix positif
  3. Le collier berbère est ajouté dans la catégorie Bijoux (id 4)
  4. Ghita Saidi est inscrite avec son propre email

4Pratiquer

Exercice 1 · Écrire les contraintes

Table stagiaires : id clé primaire auto, cin unique et obligatoire, nom obligatoire, age entre 15 et 60, filiere_id clé étrangère vers filieres(id), statut 'inscrit' par défaut.

Voir le corrigé
CREATE TABLE stagiaires (
  id INT AUTO_INCREMENT PRIMARY KEY,
  cin VARCHAR(10) NOT NULL UNIQUE,
  nom VARCHAR(60) NOT NULL,
  age INT CHECK (age BETWEEN 15 AND 60),
  filiere_id INT NOT NULL,
  statut VARCHAR(20) NOT NULL DEFAULT 'inscrit',
  FOREIGN KEY (filiere_id) REFERENCES filieres(id)
);

Exercice 2 · Ajouter une contrainte après coup

La table clients existe déjà. Ajoutez une contrainte nommée uq_email qui rend l'email unique.

Voir le corrigé
ALTER TABLE clients
ADD CONSTRAINT uq_email UNIQUE (email);

Exercice 3 · Supprimer en cascade

On veut que la suppression d'une commande supprime automatiquement ses lignes. Écrivez la clé étrangère de lignes_commande vers commandes.

Voir le corrigé
FOREIGN KEY (commande_id) REFERENCES commandes(id)
  ON DELETE CASCADE

5Vérifier

1. Quelle contrainte empêche deux clients d'avoir le même email ?
2. Que garantit l'intégrité référentielle ?
3. Avec ON DELETE CASCADE sur clients(id), supprimer un client...