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 »
 

 
Liste des commandes MySQLListe des commandes MySQLDans ce tutoriel vous allez découvrir les différentes commandes MySQL qui devraient être utiles pour travailler avec des bases de données.   1. Pour vous…Lire plus 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 ».
 

Questions techniques sur MYSQLQuestions techniques sur MYSQL – Partie 1Nous avons divisé cette collection de questions techniques sur MYSQL sous sept chapitres là, c’est la premiere, puis vous trouverez la deuxième partie, la troisième…Lire plus

6 réflexions sur “MySQL ON DELETE CASCADE

  • décembre 4, 2019 à 4:43
    Permalien

    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.

    Répondre
    • décembre 5, 2019 à 9:45
      Permalien

      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

      Répondre
      • décembre 6, 2019 à 12:04
        Permalien

        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 ?

        Répondre
      • décembre 6, 2019 à 12:19
        Permalien

        J’ai oublié de préciser que j’effectue mes tests sur PhpMyAdmin aussi. Je le dis au cas où cela changerai quelque chose.

        Répondre
    • décembre 6, 2019 à 2:52
      Permalien

      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.

      Répondre
      • décembre 7, 2019 à 7:14
        Permalien

        Oui, tout cela est bel et bien présent dans mon code. Merci quand même pour votre aide, je continuerai à chercher !

        Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *