IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Suppression récursive d'éléments dans une table [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut Suppression récursive d'éléments dans une table
    Bonjour!

    Nous avons une table contenant des elements et un nombre potentiellement infini de sous-elements.
    Nous vroudrion supprimer a la fois l'element et ses sous-elements pour un id donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Parent1
         Enfant1
            Sous-enfant1-1
            Sous-enfant1-2
         Enfant2
            Sous-enfant2-1
         Enfant3
            ...
    Parent2
          ...
    la table est construite ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id
    nom
    id_parent // l'id du parent direct (Enfant1 pour Sous-enfant1-1 et 1-2)
    id_root // l'id du parent le plus haut (Parent1 pour toute son arborescence)
    Par exemple, si nous voulons supprimer Parent1, il faudrais supprimer enfant1 et deux ainsi que leurs sous-enfants.

    Comment faire ca simplement en php ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 774
    Points : 936
    Points
    936
    Par défaut
    la solution la plus simple a mon avis est d'ajouter une une contrainte a la table
    en question. Une contrainte du genre on delete cascade. Comme ça en cas de suppression, les enregistrements fils seront supprimés automatique.
    PS: c'est une solution non php mais plutot niveau base de donnée
    je pars sur le principe que la base de données à ete contruites proprement

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    d'accord avec toi ouatmad.
    En ce qui concerne la base de donnée la meme mal construite ca dois concerner une association unaire, et partant de la, le on delete cascade sera toujours possible je pense

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Ok merci !
    J'ai regarde le fonctionnement de CASCADE, mais apparemment, ca ne fais que lier un parent a x enfant(s) d'une table associee.

    Comment faire si j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Parent
         Fils1
             Fils2 (de Fils1)
    Si je supprime Parent, je supprime Fils1, mais comment supprimer Fils2 ?

    Est-ce que c'est possible avec deux tables (parents/enfant) ? Et comment la construire "proprement" ? Je voit pas trop quoi rajouter pour gerer une sorte de sous-fils infinis...

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 45
    Points : 54
    Points
    54
    Par défaut
    En théorie avec on "on delete cascade" si tu supprimes le parent alors tous les enfants (et même les enfants des enfants) doivent être supprimés

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    oui, si aux enfants je leur donne comme lien le parent, mais a ce moment je ne pourrais pas supprimer un enfant (Fils1 dans mon exemple) et ses enfants (Fils2) ?

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 774
    Points : 936
    Points
    936
    Par défaut
    faut revoir le fonctionnement de cascade. ça marche pour ce que tu veux faire.
    supposons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Parent
        fils1
            fils1.1
            fils1.2
                   fils1.2.1
                   fils1.2.2
         fils2
    si tu supprime parent, l'arborescence est supprimé
    si tu supprime fils1.2, fils1.2.1 et fils1.2.2 seront supprimé et le reste de l'arborescence reste sans changement. tu obtiens donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Parent
        fils1
            fils1.1
         fils2

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Ok, ca me semble logique, mais j'ai du me tromper en testant le mode cascade

    Concretement, comment tu construit ta base de donnee pour ton exemple ? Moi j'avais fait deux tables, parent et enfant, construite ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Table Parent
      id (int) primary key
      name (varchar) 25
     
    Table Enfant
       id (int) primary key
       id_parent (int) foreign key sur parent->id
       name (varchar) 25
    Et j'enregistrais Parent dans la table parent; puis fils1 fils2 dans la table enfant associee a l'id de parent.

    Puis ? Comment je fais ? Je pensais enregistrer fils1 dans la table parent aussi, puisqu'il est parent de fils1.1, etc. Mais apres la cascade ne supprime pas dans la table parent...

    Est-ce qu'il faut creer une table pour chaque enfant a ce moment la ?

    Merci d'avance

  9. #9
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 327
    Points
    4 327
    Par défaut
    Bon alors c'est simple

    Tu stock tout dans la même table. Puis tu fait une auto-jointure, avec un on delete cascade, et le tour est joué.
    En détail ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE `ELEMENT`
    (
      `identifiant` INTEGER NOT NULL AUTO_INCREMENT,
      `information1` VARCHAR(20),
      `information2` TIMESTAMP,
      `identifiantDuPere` INTEGER NULL DEFAULT NULL,
      CONSTRAINT `PK_ELEMENT` PRIMARY KEY (`identifiant`),
      CONSTRAINT `FK_ELEMENT_ELEMENT` FOREIGN KEY (`identifiantDuPere`) REFERENCES `ELEMENT` (`identifiant`) ON DELETE CASCADE
    ) ENGINE = `innoDB`;
    Comment supprimer un element et tout ses fils ?
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE FROM ELEMENT WHERE identifiant='identifiantASupprimer';
    Comment ca marche ?
    A chaque fois qu'on détruit un element, on detruit son/ses fils, et comme les fils sont des elements, l'actions se répete, et on détuit les fils du fils quand un fils est détruit, et ceci a l'infini.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Merci ! Ca marche exactement comme je veux et la solution est vraiment propre ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb Insertion d'éléments dans une table avec mySql++
    Par donkeyquote dans le forum C++
    Réponses: 1
    Dernier message: 24/02/2008, 00h39
  2. Réponses: 1
    Dernier message: 22/01/2008, 16h58
  3. insérer pleins d'éléments dans une table
    Par cyrano_de_bergerac dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/11/2007, 15h51
  4. suppression des caratères spéciaux dans une table
    Par syl221 dans le forum Access
    Réponses: 6
    Dernier message: 31/08/2005, 09h20
  5. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo