Adloun

Supprimer un client, et ses commandes

Exercice d'entraînement · niveau 3 (difficile) · mathématiques appliquées (ECG 2e année), chapitre 13 — Bases de données et travaux pratiques · Modifier une base

Énoncé

Une base contient une table client(id, nom, ville) et une table commande(id, client_id, montant), où client_id est déclarée comme clef étrangère vers client(id). Le client a passé deux commandes. On veut supprimer ce client de la base. Écrire les requêtes nécessaires, dans le bon ordre, et expliquer ce qui rend cet ordre obligatoire.

Corrigé

Le problème posé par l'ordre naïf. Si l'on écrit d'abord


DELETE FROM client
WHERE id = 3;

les deux commandes du client subsistent, et leur champ client_id désigne désormais un client qui n'existe plus. Ce sont des lignes orphelines, et elles violent la contrainte de clef étrangère : le système refuse la suppression, précisément parce que la contrainte a été déclarée.

L'ordre correct. On supprime d'abord ce qui référence, puis ce qui est référencé :


DELETE FROM commande
WHERE client_id = 3;

DELETE FROM client
WHERE id = 3;

Après le premier DELETE, plus aucune ligne de commande ne pointe vers le client ; le second peut alors s'exécuter sans rompre aucun lien.

Pourquoi cet ordre est obligatoire. La clef étrangère est une promesse : à tout moment, chaque client_id de commande correspond à un id existant dans client. Supprimer le client d'abord romprait cette promesse pendant un instant — et une contrainte ne tolère pas d'être fausse un instant. Elle est vérifiée à chaque requête, jamais « à la fin ».

Ce qu'il faut avoir en tête avant d'exécuter. Ces deux suppressions sont définitives : SQL ne demande aucune confirmation et n'offre pas de retour en arrière. On vérifie donc d'abord ce qu'elles vont atteindre, par une lecture :


SELECT id, montant FROM commande
WHERE client_id = 3;

Le piège symétrique. Écrire DELETE FROM commande; sans la condition supprimerait toutes les commandes de tous les clients. Aucune contrainte ne s'y opposerait, puisque vider une table qui référence n'orpheline personne : c'est parfaitement cohérent, et parfaitement catastrophique.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.