Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1511 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2255256
brutax
Posté le 08-04-2015 à 11:36:25  profilanswer
 

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
mood
Publicité
Posté le 08-04-2015 à 11:36:25  profilanswer
 

n°2255286
kao98
...
Posté le 08-04-2015 à 17:05:53  profilanswer
 

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
n°2255287
rufo
Pas me confondre avec Lycos!
Posté le 08-04-2015 à 17:33:38  profilanswer
 

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
n°2255288
kao98
...
Posté le 08-04-2015 à 17:44:46  profilanswer
 

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
n°2255309
rufo
Pas me confondre avec Lycos!
Posté le 08-04-2015 à 23:04:40  profilanswer
 

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
n°2255313
brutax
Posté le 09-04-2015 à 09:05:03  profilanswer
 

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 :)

n°2255361
brutax
Posté le 09-04-2015 à 15:38:44  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
optimisation requête mysql[MySQL] Savoir combien de champs sont renseignés parmi 7
hote MySQL // resolu"Scinder" une colonne en deux MySql
Actualisation automatique de lignes avec MySQLequivalence mysql_escape_string en PDO
Convertir moteur recherche mysql_ en PDOSite web référencé
Importation cvs dans mysql[RESOLU][PHP][MYSQL]requête Mysql (INSERT)
Plus de sujets relatifs à : [Résolu][MySQL]-auto-référence


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR