Les tables liées (par exemple, "commandes" et "clients") existent dans les bases de données relationnelles depuis le début, mais à leurs débuts, le contrôle de l'intégrité devait être implémenté manuellement via la logique applicative. Avec l'évolution du SQL, des contraintes intégrées (FOREIGN KEY) et des actions automatiques (CASCADE) ont été introduites.
Contexte de la question:
À l'origine, les bases de données avaient besoin de mécanismes pour maintenir l'intégrité afin qu'il n'y ait pas d'enregistrements "orphelins" (par exemple, une commande sans client existant). FOREIGN KEY est devenu la norme, et les options CASCADE ont automatisé la synchronisation lors des suppressions et des modifications.
Problème:
Sans actions en cascade, la suppression ou la mise à jour d'une ligne dans la table principale peut entraîner des erreurs ou des données "orphelines". Confier cette tâche à l'application implique souvent des difficultés de maintenance et un risque d'incidents lors d'opérations massives. Une utilisation incorrecte des actions en cascade peut provoquer des suppressions en avalanche ou violer la logique métier.
Solution:
L'utilisation de FOREIGN KEY avec ON DELETE CASCADE et ON UPDATE CASCADE permet de maintenir automatiquement l'intégrité et de synchroniser correctement les tables liées. Dans des scénarios complexes (par exemple, si vous avez besoin non seulement de supprimer, mais aussi de journaliser les actions), des triggers sont utilisés.
Exemple de code :
CREATE TABLE Clients ( ClientID INT PRIMARY KEY, Nom NVARCHAR(100) ); CREATE TABLE Commandes ( CommandeID INT PRIMARY KEY, ClientID INT, Montant DECIMAL(10,2), FOREIGN KEY (ClientID) REFERENCES Clients(ClientID) ON DELETE CASCADE ON UPDATE CASCADE );
Principales caractéristiques :
La suppression en cascade est-elle toujours la meilleure pratique pour toutes les relations ?
Non : pour les données « historiques » ou l'information archivistique, la suppression en cascade peut entraîner la perte d'informations précieuses. Il est important de comprendre la valeur métier de chaque type de relation.
Est-ce que ON UPDATE CASCADE fonctionne si la clé étrangère n'est pas incluse dans la PRIMARY KEY de la table parente ?
Dans la plupart des SGBD, la clé étrangère doit référencer une PRIMARY KEY ou une clé unique pour que les cascades soient prises en charge. Sinon, la commande ne fonctionnera pas.
Une chaîne de cascade peut-elle dépasser les limites autorisées de profondeur d'imbrication (récursion), et que se passe-t-il ?
Oui : avec de grandes cascades, il est possible de dépasser la limite de profondeur (par exemple, dans SQL Server — 32). Cela entraînera une erreur et un rollback de l'opération.
Dans un système de gestion des fournisseurs et des commandes, ON DELETE CASCADE a été appliqué — les clients ont accidentellement supprimé un fournisseur important, toutes les commandes ont été supprimées automatiquement, et l'historique des livraisons a été perdu. La récupération des données est devenue impossible.
Avantages :
Inconvénients :
ON DELETE SET NULL a été utilisé, avec un trigger pour la journalisation — même après la suppression d'un enregistrement client, l'historique des commandes était conservé (le statut d'irrélevance a été attribué), aucune suppression massive accidentelle n'a eu lieu.
Avantages :
Inconvénients :