MySQL ON DELETE CASCADE
Dans le tutoriel précédent, nous avons vu comment supprimer des lignes d’une tables en utilisant l’instruction DELETE. MySQL fournit un moyen plus facile qui vous permet de supprimer automatiquement les données des tables filles lorsque vous supprimez les données de la table mère en utilisant ON DELETE CASCADE.
Exemple: ON DELETE CASCADE
Nous allons utiliser une simple base de données qui est constitué de deux tables:
- La table des clients stocke les données sur les clients avec l’identifiant, le nom, l’age et l’adresse du client.
- La table des commandes stocke les commandes effectués par des clients.
Table « Clients »
Table « Commandes »
Le lien entre la table « Clients » et la table « Commandes » est le champ « ClientID ».
Lorsque vous supprimez une ligne de la table « Clients », vous souhaitez également supprimer toutes les lignes de la table « Commandes » qui font référence à la ligne de la table « Clients ». Pour faire cela, la clé étrangère « ClientID », dans la table « Commandes » doit avoir la clause ON DELETE CASCADE à la fin, comme suivant:
CREATE TABLE Commandes ( CommandeID int AUTO_INCREMENT PRIMARY KEY, NumCommande int NOT NULL, Totale DECIMAL(12,2) NOT NULL, ClientID int, FOREIGN KEY (ClientID) REFERENCES Clients (ClientID) ON DELETE CASCADE );
Maintenant, lorsque vous supprimez une ligne de la table « Clients » par exemple le client avec l’id = 5. Automatiquement, toutes les lignes de la table « Commandes » qui font référence à la ligne de la table « Clients » seront supprimées.
DELETE FROM Clients WHERE ClientID = 5;
Maintenent on vérifier si le client avec l’id = 5 a été supprimé de la table « Clients » et « Commandes ».
Bonjour, cela fait 3 jours que je suis sur ce problème. J’utilise bel et bien cette méthode, mais rien n’y fait. J’ai une table « PERSONNE » avec un « ID_P » (clé primaire) et la table « CONTRIBUTEUR » avec une clé étrangère « IP_C » qui fait référence à PERSONNE(ID_P) mais lorsque que je supprime ma ligne dans PERSONNE, il ne supprime pas dans CONTRIBUTEUR. J’ai pourtant bien écrit : CONSTRAINT FK_CONTRIBUTEUR_PERSONNE FOREIGN KEY (ID_C) REFERENCES PERSONNE(ID_P) ON DELETE CASCADE
Auriez- vous une idée de pourquoi cela ne fonctionne pas ?
Cordialement.
Bonjour Quentin,
Remarquez bien, ça peut être une faute d’orthographe, vous avez nommé la clé étrangère « IP_C », donc la requête doit être écrite comme suit : CONSTRAINT FK_CONTRIBUTEUR_PERSONNE FOREIGN KEY (IP_C) REFERENCES PERSONNE(ID_P) ON DELETE CASCADE
Bonjour, oui c’est bien une faute de frappe. La clé étrangère est bel et bien ID_C. Désolé pour cette erreur. Mais du coup je ne vois pas d’où viens le problème.
Auriez-vous une idée ?
J’ai oublié de préciser que j’effectue mes tests sur PhpMyAdmin aussi. Je le dis au cas où cela changerai quelque chose.
Normalement votre requête est correcte, mais vous devez être sur que le type de données pour PERSONNE.ID_P doit correspondre à celui de CONTRIBUTEUR.ID_C et n’oubliez pas que les contraintes doivent être déclarées après les colonnes.
Bonne chance.
Oui, tout cela est bel et bien présent dans mon code. Merci quand même pour votre aide, je continuerai à chercher !