|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 15 ![]() |
Bonjour à tous,
Je rencontre un petit soucis tout bête pour lequel je suis sûr qu'il existe une solution toute simple Je voudrais pouvoir supprimer l'intégralité des informations relatives à un même membre dans toutes mes tables d'un coup. Pour cela j'ai un index commun à toutes les tables : id_membre. Je me suis donc naturellement tourné vers la solution suivante : Code :
Mon problème vient du fait que selon les membres, il est possible que certaines tables ne contiennent aucune ligne commençant par l'id_membre correspondant. Du coup la requête basique suivante ne peut pas fonctionner correctement et renvoie une erreur "die" qui bloque toute la requête. Existe-t-il une solution simple et légère ? Dans le pire des cas j'ai la possibilité de tester la présence d'information dans chaque table et de supprimer ou non selon le résultat... Mais cette solution n'est ni simple ni légère Merci d'avance à ceux qui pourront me renseigner |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Saluton,
Si les tables ont été créées avec le moteur InnoDB, que la colonne id_membre est une clé étrangère dans les tables table2, table3 et que la déclaration de clé comporte la clause ON DELETE CASCADE, supprimer une valeur dans table1 la supprimera dans les autres tables. Sinon, il te faudra faire 3 requêtes.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 15 ![]() |
Merci pour ta réponse Maljuna Kris
Je n'ai pas tout compris, du coup je pense que les réponses à tes questions sont toutes "non" Les tables sont créées tout simplement dans phpmyadmin Donc tu confirmes que je n'aurai pas d'autres choix que de créer une requête par table en testant la présence de mon id_membre dans chacune ? |
|
|
00
|
|
|
#4 | ||
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
MySQL possède une version multi-table du DELETE, dans laquelle on peut faire figurer des jointures.
La syntaxe suivante devrait passer : Code :
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
||
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Ah oui, je n'avais pas pensé au LEFT JOIN, bien vu ced, comme d'hab.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 15 ![]() |
Ok, je vais me pencher sur la question
A quoi correspondent t1, t2, t3 ? |
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Aux alias des tables dans la clause FROM et les jointures.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#8 | ||
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 15 ![]() |
Ahah, je viens de supprimer la totalité de ma base de donnée en testant la requête ci-dessus
La bonne nouvelle c'est que ça a l'air de fonctionner puisqu'aucune suppression n'a échouée. Il faut juste que j'arrive à limiter à l'id_membre concerné. J'ai essayé la requête suivante, sans succès : Code :
|
||
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
Oui, la clause WHERE se met après les jointures.
Au passage, si id_membre est un entier, inutile de mettre la valeur entre quotes.
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
|
|
#10 | ||
|
Invité de passage
![]() Inscription : septembre 2009 Messages : 15 ![]() |
Ok, merci beaucoup pour les conseils que vous m'avez donné.
Malheureusement ça ne fonctionne pas, du coup je vais peut-être me tourner vers une solution plus dans mes cordes. N'ayant jamais entendu parler de clé étrangères ou de DELETE ON CASCADE je risque de bidouiller pendant des jours pour faire quelque chose que je ne comprends pas. C'est quand même dingue qu'il soit si difficile de faire comprendre à SQL que si une table ne contient pas l'ID demandée on laisse tomber et on passe à la table suivante... Ça semble tellement simple sur le papier... Je me dirige vers une solution PHP avec un foreach. J'ai toujours le même soucis de plantage quand l'ID n'est pas présente mais je perd pas espoir ![]() EDIT : Voilà la solution que j'ai appliqué pour contourner le problème. Vu le nombre de topics trouvés sur Google, ça pourra peut-être servir à quelqu'un : Code :
|
||
|
|
00
|
|
|
#11 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Mais encore ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#12 |
![]() ![]() ![]() Cédric DuprezInscription : avril 2002 Messages : 3 823 ![]() |
C'est parce que le SQL suit une logique ensembliste, et non pas ligne à ligne comme un langage de programmation.
__________________
Rédacteur / Modérateur SGBD Mes tutoriels et la FAQ MySQL ---------------------------------------------------- Pensez aux balises code et au tag Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com