[MySQL]delete sur une arborescence

delete sur une arborescence [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 24-04-2006 à 14:36:24    

Hello,  
 
j'ai une table avec une structure arborescente : chaque élément connait l'id de son parent. La "racine" de l'arbre a un id de parent qui vaut 0.
 
Lorsque je détruis un élement de cet arborescence, je veux détruire tous ses "descendants". Je pensais faire un trigger, qui, quand je détruis un élément, va détruire en cascade tous les éléments enfants. J'ai fait ça :  

Code :
  1. create trigger deleteEnCascade before delete on hierarchie
  2. for each row delete from hierarchie where old.parentId = old.elementId;


Bien sur ça marche pas, je ne peux pas faire référence au nom de la table dans l'instruction du trigger :  

Code :
  1. ERROR 1442 (HY000): Can't update table 'hierarchie' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.


 
Je pensais mettre une FK sur le parent. On ne peut pas placer une FK dépendant de sa propre table.
 
Je pensais faire une procédure stockée récursive, MySQL ne les gère pas :x
 
Comment faire ? Vais-je être obligé de faire ça côté application ? Quelqu'un a une autre solution ?


Message édité par Djebel1 le 24-04-2006 à 17:32:03
Reply

Marsh Posté le 24-04-2006 à 14:36:24   

Reply

Marsh Posté le 25-04-2006 à 16:32:00    

tout le monde fait ça côté application ? :)

Reply

Marsh Posté le 25-04-2006 à 16:41:05    

quel est le format de tes tables?

Reply

Marsh Posté le 25-04-2006 à 18:23:43    

innodb


Message édité par Djebel1 le 25-04-2006 à 18:24:04
Reply

Marsh Posté le 26-04-2006 à 14:00:00    

si vous voyez pas comment faire autrement que dans l'application, dites le moi, jme sentirai moins con :D

Reply

Marsh Posté le 26-04-2006 à 14:24:49    

Djebel1 a écrit :

si vous voyez pas comment faire autrement que dans l'application, dites le moi, jme sentirai moins con :D

Bon ben je le dis alors :D  
C'est jamais simple à gérer, ces arborescences :(  

Reply

Marsh Posté le 26-04-2006 à 14:35:57    

Une solution, sans être sur qu'elle soit possible, tu crée une nouvelle table avec la même structure que Hierarchie. Cette table est vide.
Tu fais ton delete normal sur cette table, comme si il s'agissait de la table hierarchie, et la tu declenche ton trigger before qui vire les parents dans ta "vrai" table hierarchie et la ligne que tu veux supprimer.
 
Sinon tu passes par l'application :D !

Reply

Marsh Posté le 26-04-2006 à 14:42:03    

oula paye ta bidouille :D
 
J'en viens à envisager la solution suivante :  
faire une table à part, contenant simplement l'ID d'un élément et l'ID de son père.
 
Sur la table principale, le delete d'un élément provoque la destruction de l'enregistrement correspondant dans la table à part. Ce delete provoque lui-même le delete de l'élément enfant dans la table principale.
Et ainsi de suite.
 
Ca parait pas mal ça non ?

Reply

Marsh Posté le 26-04-2006 à 15:05:00    

bon en fait cette solution est miteuse, ça impliquerait de lever la contrainte de FK à chaque insertion dans la base, donc je trouve ça encore plus pourri que de devoir gérer le delete coté appli :D

Reply

Marsh Posté le 26-04-2006 à 15:32:45    

j aurais personnelement fait ca dans l'application

Reply

Marsh Posté le 26-04-2006 à 15:32:45   

Reply

Marsh Posté le 26-04-2006 à 15:36:44    

ouep, pas le choix j'ai l'impression, j'aurais préféré que ça soit la base qui gère ça, tant pis.
On attendra que MySQL sorte des proc stockées récursives

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed