Aller au contenu

Sujets conseillés

Posté (modifié)

Oups, je me suis trompé de rubrique, merci de me déplacer vers la rubrique SQL . Merci :wub:

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:

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

Doudy

Modifié par doudy
Posté

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

Posté

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

Posté

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

Posté

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 >

$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 ;)

Nico.

Posté

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:

Je vais essayer cette méthode ...

Merci encore. :thumbsup:

Doudy

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...