Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les "trigger" mysql

C'est quoi cette chose ?

Sujet résolu
    29 mars 2011 à 1:36:25

    Bonsoir à tous,
    Je viens de lire la documention sur les trigger (qui semblent intéressant).

    Mais ne comprenant pas totalement la chose,
    Je viens vers vous afin d'en savoir un peu plus !

    Voyons un cas pratique :

    Je souhaite créer un trigger :
    Il devra incrémenter le champ "nombre" d'une table "table_1" ou le champ "id_table_1" sera identique à un insert sur la table "table_2"

    J'ai donc la table "table_1" :
    id_table_1 (int, auto incrément)
    nombre (int)

    La table "table_2"
    id_table_2 (int, auto incrément)
    id_table_1 (int)
    autre_champ (varchar)

    Exemple table "remplie" :

    table_1 :
    id_table1 | nombre
    1 | 3
    2 | 1

    table_2 :
    id_table_2 | id_table_1 | autre_champ
    1 | 1 | premier
    2 | 1 | deuxieme
    3 | 2 | premier
    4 | 2 | deuxieme
    5 | 1 | troisieme

    Je fais mon insert :
    INSERT INTO table_2(id_table_2, id_table_1, autre_champ) VALUES(NULL, 2, "troisieme")

    L'élément déclencheur est donc la.
    Ensuite, il faut qu'il fasse "tout seul"
    UPDATE table_1 SET nombre = nombre + 1 WHERE id_table_1 = "2"

    Mon exemple est donc fini.
    Passons au question :

    1. Les triggers servent-ils à/peuvent-ils faire ça ?
    1. a) oui, on passe à la question 2.
    1. b) non, on passe à la question 3.
    2. Comment le construiseriez-vous ? (j'entends par la, m'aideriez-vous)
    3. Voyez-vous autre chose qui pourrait faire ce que je souhaite ? (de façon automatisé à chaque nouvel insert)

    D'avance merci.

    Ps : je ne suis pas un pro de sql, vous en conviendrez :D
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      29 mars 2011 à 7:49:59

      les Triggers te servent à confectionner des contraintes (souvent). Par exemple dans mon projet de bibliothèque un étudiant ne peut pas réserver plus de 4 livre alors je dois mettre en place un trigger qui vérifie ça et qui valide ou non l'insert/update.ils te permette aussi à faire des petit travaux que tu n'aura pas à faire en php .
      Exemple : quand un livre est réserver son statut s'actualise par Trigger .

      Edit : ils permettent de sécuriser tes entrés dans la base de données quoi ;)
      • Partager sur Facebook
      • Partager sur Twitter
        29 mars 2011 à 9:15:15

        Donc impossible de faire ce que je souhaite ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          29 mars 2011 à 9:40:59

          tu as l'auto incrément si c'est ton id ..
          • Partager sur Facebook
          • Partager sur Twitter
            29 mars 2011 à 10:44:13

            Justement ce n'est pas id ^^'

            C'est un nombre qui totalise le nombre de ligne contenue dans table_2 en fonction de l'id_table_1
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              29 mars 2011 à 10:55:50

              avec un trigger tu pourrai le faire il ferait un update de la valeur actuel + 1 ; )
              • Partager sur Facebook
              • Partager sur Twitter
                29 mars 2011 à 12:22:46

                Ok

                Comme je n'en ai jamais utilisé (ouille ^^)

                Saurais-tu m'aider à le faire ?

                Je commence, évidement, mais je laisse des trous aux endroits ou je ne sais pas ce qu'il faut mettre :p

                On se lance ^^

                CREATE TRIGGER
                	exemple 
                AFTER INSERT ON 
                	table_2 
                	FOR EACH ROW
                	BEGIN
                		UPDATE table_1 SET table_1.nombre = table_1.nombre + 1 WHERE table_1.id_table_1 = table_2.id_table_1
                	END
                


                Je ne suis pas sur au niveau du WHERE.
                Mais la commande update est bonne en sois ^^'
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  29 mars 2011 à 12:29:59

                  tes noms de colonnes et de tables font mal aux yeux ! xD
                  en tout cas ça doit être un truc come ça :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mars 2011 à 12:32:36

                    Le seul moyen c'est que je teste ? :D

                    Je sais pour les noms des colones et tables, mais c'est un exemple :p
                    C'est pour que je comprenne (et me fasse comprendre) ^^

                    Aller zou je test ><
                    Si ça marche pas, je reviens vers toi :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      29 mars 2011 à 12:34:21

                      crois moi le DROP TRIGGER st ton ami ;)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 mars 2011 à 12:39:46

                        Sur ce coup la je te crois ><
                        Il merde sur le "where"
                        Aurais-tu une idée de comment lui dire ou il doit faire l'update ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          29 mars 2011 à 12:43:19

                          le plus simple c'est d'ajouter avant ton update un :
                          SET @table2Id =id_table1.new;
                          //et dans ton where tu met 
                          id_table1=@table2Id
                          


                          je sais plus s'i faut des guillemets ! xD
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 mars 2011 à 12:55:05

                            Cette requête :
                            CREATE TRIGGER
                            	exemple 
                            AFTER INSERT ON 
                            	table_2 
                            	BEGIN
                            		SET @table2Id = NEW.id_table_1;
                            		UPDATE table_1 SET table_1.nombre = table_1.nombre + 1 WHERE table_1.id_table_1 = @table2Id;
                            	END
                            

                            Me retourne l'erreure suivante :

                            #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
                            SET @table2Id = NEW.id_table_1;
                            UPDATE table_1 SET table_1.nombre = ' at line 5
                            Si tu vois plus de chose que moi :D (y en avait d'autre que j'ai réussi à faire disparaître xD)


                            ----- info :
                            Si je mets la ligne "FOR EACH ROW" il me met une erreure :s
                            Dans la doc ils mettent NEW.col_name , j'ai donc mis NEW.id_table_1 ^^

                            --- Les creates et insert pour qu'on ai les mêmes données :
                            CREATE TABLE IF NOT EXISTS `table_1` (
                              `id_table_1` int(11) NOT NULL,
                              `nombre` int(11) NOT NULL,
                              PRIMARY KEY  (`id_table_1`)
                            ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
                            
                            --
                            -- Contenu de la table `table_1`
                            --
                            
                            INSERT INTO `table_1` (`id_table_1`, `nombre`) VALUES
                            (1, 3),
                            (2, 2);
                            
                            CREATE TABLE IF NOT EXISTS `table_2` (
                              `id_table_2` int(11) NOT NULL auto_increment,
                              `id_table_1` int(11) NOT NULL,
                              `texte` varchar(25) NOT NULL,
                              PRIMARY KEY  (`id_table_2`)
                            ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
                            
                            --
                            -- Contenu de la table `table_2`
                            --
                            
                            INSERT INTO `table_2` (`id_table_2`, `id_table_1`, `texte`) VALUES
                            (1, 1, 'premier'),
                            (2, 1, 'deuxieme'),
                            (3, 2, 'premier'),
                            (4, 2, 'deuxieme'),
                            (5, 1, 'troisieme');
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              29 mars 2011 à 13:12:04

                              c'est comme ça sous mysql j'ai pris un de mes Triggers:
                              CREATE TRIGGER TR_RES_DISPONIBILITE_SUP AFTER DELETE ON TJ_RESERVER
                              
                              FOR EACH ROW
                              
                              BEGIN
                              
                               SET @articleId =old.ART_ID;
                              
                               SET @membreId =old.MEM_IDENTIFIANT;
                              
                              
                              
                               SET @etatArticle= (SELECT ART_DISPONIBILITE FROM T_ARTICLES WHERE ART_ID=@articleId);
                              
                               
                              
                                 IF @etatArticle="Réservé" THEN
                              
                                   UPDATE T_ARTICLES SET ART_DISPONIBILITE='Présent' WHERE ART_ID=@articleId;
                              
                                 END IF;
                              
                              END
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 mars 2011 à 13:15:27

                                Ok, je vais adapter le tien ^^
                                Je reviens si j'ai un soucis :p

                                C'est passé :
                                CREATE TRIGGER exemple AFTER INSERT ON table_2
                                
                                FOR EACH ROW
                                
                                BEGIN
                                
                                 SET @Id = new.id_table_1;
                                 UPDATE table_1 SET nombre = nombre + 1 WHERE id_table_1 = @Id;
                                
                                END
                                


                                Reste à voir si il fait bien ce que je veux ^^

                                Il fait bien ce que je veux MERCI ^^
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  29 mars 2011 à 13:22:37

                                  met ton sujet en résolus ;)
                                  avec les réponses qui t'ont aidés
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    29 mars 2011 à 13:25:09

                                    Résolu c'était fait ^^
                                    Les réponses non :p
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme

                                    Les "trigger" mysql

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown