IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Utilisation des triggers


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    Oui c'est possible mais quel est ta question exactement ?

  3. #3
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Merci pour cette syntaxe mais selon la doc MySQL, le mot clé OLD ne peut pas être utilisé avec un INSERT :
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    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.

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  9. #9
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    D'accord je testerai avec ça ce soir. Un grand merci pour ton aide et ta disponibilité.

    Wait & See la suite demain

  10. #10
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    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

  11. #11
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Bah la suite est pas très concluante puisque j'exécute le script suivant sous MySQLQueryBrowser version mac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  12. #12
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    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.

  13. #13
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    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

  14. #14
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation des triggers sous C#
    Par Kev9723 dans le forum C#
    Réponses: 5
    Dernier message: 03/09/2010, 15h49
  2. Utilisation des triggers key-Fx
    Par fregolo52 dans le forum Forms
    Réponses: 2
    Dernier message: 21/10/2009, 10h02
  3. Réponses: 2
    Dernier message: 21/09/2009, 15h20
  4. utilisation des triggers
    Par bouleboule dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 04/07/2005, 18h47
  5. Delphi5 (IBX) - Interbase6.0 + Utilisation des triggers
    Par _Marsu_ dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/04/2004, 19h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo