Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/08/2007, 22h38   #1
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
Par défaut Utilisation des triggers

Bonjour,

je ne suis pas certain que l'utilisation des trigger résoudra mon problème, si ce n'est pas le cas, comment puis-je faire ?
Le problème est que je dispose d'un table résumant des informations de joueur : pseudo, race, sexe, metier, ville de résidence... et une table de statistique sur les joueurs inscrits :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
CREATE TABLE `ville_statistique` (
  `idVille` int(10) UNSIGNED NOT NULL,
  `race_0` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `race_1` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `race_2` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `race_3` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `sexe_0` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `sexe_1` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `metier_A` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `metier_B` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `metier_C` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `metier_D` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `metier_E` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `total` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY  (`idVille`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='statistique de la population d''une ville';
Pour chaque ville je désire connaitre la répartition exacte des joueurs entre les races, les sexes et les metiers.
Mon idée était de mettre au point un trigger qui dès l'ajout d'un joueur dans la première table, met à jour la race, le sexe et le metier pour la ville désignée par idVille.

J'espère avoir été assez claire et que vous pourrez m'aider.
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 10h42   #2
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Oui c'est possible mais quel est ta question exactement ?
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h09   #3
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
Je ne vois pas trop comment faire mon trigger et surtout si ma table résultante est bien conçue.
Je bloque sur la syntaxe du trigger :
Code :
1
2
3
4
5
6
7
8
 
CREATE TRIGGER tgr_statVille AFTER INSERT ON tbJoueur
FOR EACH ROW
BEGIN
  IF (NEW.idRace == 0) THEN tbStat.race_0 = tbStat.race_0 + 1 WHERE tbStat.idVille = NEW.idVille;
  ELSEIF (NEW.idRace == 1) THEN tbStat.race_1 = tbStat.race_1 + 1 WHERE tbStat.idVille = NEW.idVille;
  END IF;
END
Merci d'avance pour l'aide.
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h16   #4
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par nounetmasque Voir le message
Je ne vois pas trop comment faire mon trigger et surtout si ma table résultante est bien conçue.
Je bloque sur la syntaxe du trigger :
Code :
1
2
3
4
5
6
7
8
 
CREATE TRIGGER tgr_statVille AFTER INSERT ON tbJoueur
FOR EACH ROW
BEGIN
  IF (NEW.idRace == 0) THEN tbStat.race_0 = tbStat.race_0 + 1 WHERE tbStat.idVille = NEW.idVille;
  ELSEIF (NEW.idRace == 1) THEN tbStat.race_1 = tbStat.race_1 + 1 WHERE tbStat.idVille = NEW.idVille;
  END IF;
END
Merci d'avance pour l'aide.
Je t'avous que je vois pas trop ce que tu cherches à faire dans ta condition . Alors peut être qu'il y a des fonctionnalités de mysql que je connais pas mais le WHERE ne peut être utilisé dedans.
Code :
1
2
3
4
5
6
 
IF (NEW.idRace = 0 AND old.idVille = NEW.idVille) THEN 
    new.race_0 = old.race_0 + 1; 
ELSEIF (NEW.idRace = 1 AND old.idVille = NEW.idVille) THEN 
    new.race_1 = old.race_1 + 1;
END IF;
Il y a pas de == dans les conditions. La syntaxe de mysql est assez proche du vb
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h33   #5
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
Merci pour cette syntaxe mais selon la doc MySQL, le mot clé OLD ne peut pas être utilisé avec un INSERT :
Citation:
Dans un déclencheur INSERT, seul NEW.col_name peut être utilisée : il n'y a pas d'ancienne ligne.
De plus je ne cherche pas à modifier la table sur laquelle porte le trigger (table dans laquelle je vais insérer une nouvelle ligne) mais une autre qui lui est liée. Je serai donc tenté d'utiliser la syntaxe :
Code :
1
2
3
4
5
6
 
IF (NEW.idRace = 0 AND tbStat.idVille = NEW.idVille) THEN 
    tbStat.race_0 = tbStat.race_0 + 1; 
ELSEIF (NEW.idRace = 1 AND tbStat.idVille = NEW.idVille) THEN 
    tbStat.race_1 = tbStat.race_1 + 1;
END IF;
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h40   #6
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par nounetmasque Voir le message
Merci pour cette syntaxe mais selon la doc MySQL, le mot clé OLD ne peut pas être utilisé avec un INSERT :


De plus je ne cherche pas à modifier la table sur laquelle porte le trigger (table dans laquelle je vais insérer une nouvelle ligne) mais une autre qui lui est liée. Je serai donc tenté d'utiliser la syntaxe :
Code :
1
2
3
4
5
6
 
IF (NEW.idRace = 0 AND tbStat.idVille = NEW.idVille) THEN 
    tbStat.race_0 = tbStat.race_0 + 1; 
ELSEIF (NEW.idRace = 1 AND tbStat.idVille = NEW.idVille) THEN 
    tbStat.race_1 = tbStat.race_1 + 1;
END IF;
Honte à moi en effet le old ne peut exister pour un insert.
Tu peux faire des requêtes d'insert, update, select, delete dans un trigger sans problème.
Par contre cette syntaxe pour atteindre une table je ne la connais pas.
tbStat.race_0 WHERE ...
Personnellement, j'utilise directement une requête d'update. Ma fois si ça marche ainsi pourquoi pas
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 11h59   #7
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
Citation:
Envoyé par berceker united Voir le message
Par contre cette syntaxe pour atteindre une table je ne la connais pas.
tbStat.race_0 WHERE ...
Personnellement, j'utilise directement une requête d'update. Ma fois si ça marche ainsi pourquoi pas
Bah justement je ne suis pas non plus persuadé que cette syntaxe fonctionne bien au contraire . De ce fait mon idée de trigger ne doit pas être applicable à mon problème ou sinon sous une autre forme.

Ton utilisation d'update est intéressant mais je ne vois pas comment la mettre en place avec des trigger ou autre. Mon problème reste le même, je dois mettre à jour des colonnes d'un autre table t2 après l'insertion d'une ligne dans t1.
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h12   #8
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par nounetmasque Voir le message
Bah justement je ne suis pas non plus persuadé que cette syntaxe fonctionne bien au contraire . De ce fait mon idée de trigger ne doit pas être applicable à mon problème ou sinon sous une autre forme.

Ton utilisation d'update est intéressant mais je ne vois pas comment la mettre en place avec des trigger ou autre. Mon problème reste le même, je dois mettre à jour des colonnes d'un autre table t2 après l'insertion d'une ligne dans t1.
Non tu peux mettre un update en place.
Code :
1
2
3
4
5
6
 
  IF (NEW.idRace = 0 AND tbStat.idVille = NEW.idVille) THEN     
    UPDATE tbStat SET race_0 = tbStat.race_0 + 1 WHERE idVille = NEW.idVille;
ELSEIF (NEW.idRace = 1 AND tbStat.idVille = NEW.idVille) THEN     
  UPDATE tbStat SET race_1 = race_1 + 1 WHERE idVille = NEW.idVille;
END IF;
Tente avec ça.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h21   #9
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
D'accord je testerai avec ça ce soir. Un grand merci pour ton aide et ta disponibilité.

Wait & See la suite demain
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h45   #10
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par nounetmasque Voir le message
D'accord je testerai avec ça ce soir. Un grand merci pour ton aide et ta disponibilité.

Wait & See la suite demain
Pa ni problème
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 22h39   #11
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
Bah la suite est pas très concluante puisque j'exécute le script suivant sous MySQLQueryBrowser version mac :
Code :
1
2
3
4
5
6
7
8
9
 
DELIMITER $$
CREATE TRIGGER tgr_statVille AFTER INSERT ON joueur_avatar
FOR EACH ROW
BEGIN
	IF (NEW.idRace = 0) THEN UPDATE ville_statistique SET race_0 = race_0 + 1 WHERE idVille = NEW.idVille;
	END IF;
END;
DELIMITER ;
Aucune erreur n'est renvoyée ce qui me fait penser que le trigger est créé, pourtant la commande SHOW TRIGGERS me prouve le contraire

Qu'est c'est y que je peux faire ?
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 22h54   #12
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Place le contenu actuel en commentaire et fait juste un insert basic pour voir si le trigger fonctionne quand même.
perso j'utilise EMS ce qui me facilite la création de trigger.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 08h32   #13
Membre éprouvé
 
Avatar de nounetmasque
 
Inscription : janvier 2003
Messages : 491
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 491
Points : 488
Points : 488
J'ai justement testé le trigger avec un insertion dans ma table joueur_avatar et ça n'a eu aucun impact sur mon autre table...

Le problème ne vient plus de la syntaxe mais de la mise en place. Je chercherai de la doc ce week-end, encore merci pour toutes ces réponses
__________________
"Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."
nounetmasque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 10h06   #14
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par nounetmasque Voir le message
J'ai justement testé le trigger avec un insertion dans ma table joueur_avatar et ça n'a eu aucun impact sur mon autre table...

Le problème ne vient plus de la syntaxe mais de la mise en place. Je chercherai de la doc ce week-end, encore merci pour toutes ces réponses
Si tui as un émulateur windows installe EMS pour Mysql et tu verras que la gestion des triggers est assez simple. De plus, regarde si tu as les droits de créer/executer les triggers.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h29.


 
 
 
 
Partenaires

Hébergement Web