[Résolu][MySQL]-auto-référence

-auto-référence [Résolu][MySQL] - PHP - Programmation

Marsh Posté le 08-04-2015 à 11:36:25    

Bonjour à tous :)
 
Voilà, j'ai une table très simple nommée dossiers avec :

Citation :

id (int, unsigned, auto_increment)
nom (varchar 32)
id_parent (int unsigned)


 
L'idée, c'est de créer une arborescence de dossiers. Chaque dossiers a un dossier parent indiqué par le champ "id_parent" qui pointe vers un "id" de cette même table.
Sauf que, j'essaye de créer une clé étrangère :

Citation :

ALTER TABLE dossiers
ADD CONSTRAINT fk_parent FOREIGN KEY (id_parent) REFERENCES dossiers(id) ON DELETE CASCADE;


 
Et là, il me répond :

Citation :

#1452 - Cannot add or update a child row: a foreign key constraint fails (`factures`.`#sql-458_365`, CONSTRAINT `fk_parent` FOREIGN KEY (`id_parent`) REFERENCES `dossiers` (`id`) ON DELETE CASCADE)


 
Arf... :pfff:  
C'est moi qui m'y prends mal ou c'est MySQL qui gère pas ça ?
 
Merci  :bounce:


Message édité par brutax le 09-04-2015 à 09:05:44
Reply

Marsh Posté le 08-04-2015 à 11:36:25   

Reply

Marsh Posté le 08-04-2015 à 17:05:53    

J'aime bien utiliser la représentation intervallaire pour ce genre de chose.
Moins immédiat à comprendre, ça demande un petit effort au début, mais une fois que c'est acquis ça offre plus de possibilité AMA.

 

S'il n'est pas encore trop tard dans ton projet pour changer !?

 

http://www.bing.com/search?q=repré [...] SD&pc=OPER

 

http://sqlpro.developpez.com/cours/arborescence/


Message édité par kao98 le 08-04-2015 à 17:06:11

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 08-04-2015 à 17:33:38    

La représentation intervallaire, c'est bien quand t'as beaucoup de lectures et peu d'écriture, en particulier, dû au fait que le chargement de l'arbo ne nécessite qu'une seule requête SQL et non des requêtes récursives comme c'est le cas pour la représentation avec un id_parent. Cette dernière est plus adaptée quand t'as beaucoup d'écritures et moins de lectures.
 
Après, c'est relatif : mon soft Icare (cf ma signature) utilise l'id_parent pour gérer le contenu d'une configuration d'un calculateur. J'ai entre 150 et 300 items dans la conf arbo, et ça s'affiche très rapidement...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 08-04-2015 à 17:44:46    

rufo a écrit :

La représentation intervallaire, c'est bien quand t'as beaucoup de lectures et peu d'écriture, en particulier, dû au fait que le chargement de l'arbo ne nécessite qu'une seule requête SQL et non des requêtes récursives comme c'est le cas pour la représentation avec un id_parent. Cette dernière est plus adaptée quand t'as beaucoup d'écritures et moins de lectures.
 
Après, c'est relatif : mon soft Icare (cf ma signature) utilise l'id_parent pour gérer le contenu d'une configuration d'un calculateur. J'ai entre 150 et 300 items dans la conf arbo, et ça s'affiche très rapidement...


C'est sûr, il ne faut pas oublier d'analyser son besoin pour en déduire quelle représentation serait la plus adaptée.
Par contre, je comprends pas "requêtes récursives" en insert ? 2 UPDATE et un INSERT et le tour est joué. Certes, ça ne vaut pas un INSERT unique, on est d'accord :jap:
 
brutax, pour répondre à ton problème initial quand même : ton problème, c'est qu'au moins une de tes lignes dans ta table ne respecte pas la contrainte que tu souhaites mettre en place. Il faut la "corriger" avant de pouvoir appliquer ta contrainte référentielle. Enfin, me semble, je ne suis pas un spécialiste MySql.
 
Note qu'une ligne avec un id à vide, à 0, ou à null peut poser des problèmes dans ce genre de cas.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 08-04-2015 à 23:04:40    

Les requêtes récursives, c'est pour afficher l'arbo quand on utilise id_parent ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 09-04-2015 à 09:05:03    

Citation :

brutax, pour répondre à ton problème initial quand même : ton problème, c'est qu'au moins une de tes lignes dans ta table ne respecte pas la contrainte que tu souhaites mettre en place. Il faut la "corriger" avant de pouvoir appliquer ta contrainte référentielle. Enfin, me semble, je ne suis pas un spécialiste MySql.


 
OH OUIIIIII
ça marche !
 :bounce:  
 
En fait voilà, mes dossiers de base, tout en bas de "l'arborescence" avaient id_parent=0.
Sauf que l'id 0 n'existe pas.
J'ai donc créé un enregistrement :

Citation :


id=0
nom=root
parent=NULL


 
Et voilà, j'ai pu créer ma clé et tout fonctionne comme souhaité.
 [:implosion du tibia]  
 
Merci à vous deux :)

Reply

Marsh Posté le 09-04-2015 à 15:38:44    

Tiens, c'est vraiment pas mal la représentation intervallaire !
Je crois que ça correspond bien à mon cas. Je vais essayer.

Reply

Sujets relatifs:

Leave a Replay

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