Version complète: sur le forum Webmaster Hub : Table de liaison N à N
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
doudy
Oups, je me suis trompé de rubrique, merci de me déplacer vers la rubrique SQL . Merci wub.gif

Bonjour,

Voila mon petit problème de mysql/php :

J'ai deux tables : membres et territoires. La contrainte est qu'un membre peut avoir plusieurs territoires et qu'un territoire peut avoir plusieurs membres. Ce qui donne des relations N à N de chaque côté. Je dois donc créer une table de liaison (membres_territoires) qui va contenir les clés primaires des tables membres et territoires.

Pratiquement, chaque membre s'enregistre et choisit un ou plusieurs territoires qui lui sont proposés.
Un membre peut également mettre à jour sa fiche en ajoutant / supprimant des territoires.

Je me demande comment gérer au plus simple la mise à jour de la table de liaison (membres_territoires) ?
Dois-je à chaque mise à jour faire une boucle de recherche du couple id_membres/ id_territoires dans le table de liaison pour le supprimer ou l'ajouter ? wacko.gif
Ou bien existe-il une commande MySql qui fait ce travail automatiquement ?

Je vous remercie d'avance pour les pistes que vous pourriez me donner smile.gif

Doudy
Tizel
Pour l'ajout, tu n'a pas le choix... Il faut que tu ajoute toutes les laisons une à une.
Pour la supression, dans les bases de données, tu as la contrainte "ON DELETE CASCADE" qui permet de supprimer toutes les liaisons qui concerne un membre ou un territoire que tu supprime.

Tizel
doudy
Merci Tizel pour l'info ...
... mais pour utiliser les contraintes de clés étrangères FOREIGN KEY et ON DELETE CASCADE ...
je dois passer mes tables de MyiSAM en InnoDB.

Est-ce que je vais perdre en perf et en espace d'occupation ?
Devrais-je retoucher mon code sql qui marchait bien en MyiSAM ?

Bref, est-ce que le passage en InnoDB. se fait sans douleur ?

Merci d'avance.

Doudy
Kioob
Hello,

si tu es limité à MyIsam, tu peux envisager l'utilisation de triggers faisant (partiellement) la même chose. A condition d'avoir une version récente de MySQL (5.1.x je crois, mais à vérifier).
Anonymus
CODE
Dois-je à chaque mise à jour faire une boucle de recherche du couple id_membres/ id_territoires dans le table de liaison pour le supprimer ou l'ajouter ? wacko.gif
Ou bien existe-il une commande MySql qui fait ce travail automatiquement ?

Ce que tu peux faire (et c'est la solution que j'utilises en général)

> delete from membre_territoire where membre_id =xxx
pour chaque territoire :
> insert into membre_territoire values xxx, yyy

Autrement dit, dans ta table de liaison, tu vires tout ce qui concerne 'ce' membre, puis ensuite tu mets tout ce qu'il a coché.

Ton insert dans la table de liaison peut se faire en une seule fois >

CODE
$q = "insert into membre_territoire (id_membre, id_territoire) values ";

foreach($_post['territoire'] as $k => $v)
$q .= " ('".$id_membre."', '".$v."'), ";

$q = substr($q, 0,-2);
mysql_query($q);

de tête, sans tester..
Vérif. le 'post' évidemment, mais c'est à peu près ca wink.gif

Nico.
doudy
Merci Nico,

Ta solution est simple et facile à implémenter, surtout que sur mon serveur mutualisé je ne peux pas utiliser les triggers et autres trucs trop pointus wacko.gif

Je vais essayer cette méthode ...

Merci encore. a_thumbsup_20.gif

Doudy
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.