Partage
  • Partager sur Facebook
  • Partager sur Twitter

vider table dans un trigger

Sujet résolu
    15 novembre 2017 à 10:26:52

    Salut à tous,

    Je dois vider le contenu d'une table par trigger après que le contenu de cette table soit enregistré dans une autre, j'ai un premier delete from qu marche ensuite l'enregistrement niquel, mais quand il faut vider la table du début tous plante pourriez-vous m'aidez svp =)

    BEGIN 
    
    delete from test.recup;
    
    INSERT INTO test.recup(idbalise, latitude, longitude, rayon, time, nbmsg) 
    SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'ID=', -1), '&', 1),
    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'LAT=', -1), '&', 1),
    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'LNG=', -1), '&', 1),
    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'RAYON=', -1), '&', 1),
    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'TIME=', -1), '&', 1),
    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'NBMSG=', -1), ' HTTP', 1)
    FROM test  ;
    
    delete from test;
    END

    Merci et bonne journée =)

    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2017 à 10:41:21

      Bonjour,

      Thomas39100 a écrit:

      quand il faut vider la table du début tous plante

      C'est à dire ? Une erreur ? Laquelle ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        15 novembre 2017 à 10:53:17

        Je vais mieux m'expliquer ^^

        Je travaille dans une base de données appeler test2 avec une table test qui comporte 2 champ id et datatest

        Ensuite, j'ai une autre bd appelé test qui lui contient une table recup avec les champs id idbalise lat long etc...

        Quand j'enregistre dans la bdd test2 table test avec la commande
        INSERT INTO test
          values(id , "GET /PATH?ID=367C07&LAT=47.06862641301106&LNG=5.452158122658654&RAYON=9290&TIME=1510570975&NBMSG=134 HTTP/1.1 HOST: 193.248.197.97:1041 ACCEPT-LANGUAGE: FR ACCEPT-ENCODING: GZIP,DEFLATE USER-AGENT: SIGFOX ACCEPT-CHARSET: UTF-8;Q=0.9,*;Q=0.7" );
        

        cela lance mon trigger

        qui va dans la bdd test table recup la vider avant de faire un insert into des informations et à la fin, je voudrais delete from la table test dans la bdd test2

        Mais voilà mon souci et que je ne peux plus :

        INSERT INTO test
          values(id , "GET /PATH?ID=367C07&LAT=47.06862641301106&LNG=5.452158122658654&RAYON=9290&TIME=1510570975&NBMSG=134 HTTP/1.1 HOST: 193.248.197.97:1041 ACCEPT-LANGUAGE: FR ACCEPT-ENCODING: GZIP,DEFLATE USER-AGENT: SIGFOX ACCEPT-CHARSET: UTF-8;Q=0.9,*;Q=0.7" );
        
        je n’ai pas d'erreur tous marche sauf le
        delete from test;



        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2017 à 10:57:05

          Peut-être essayer :

          delete from test2.test;

          Mais c'est surprenant que tu n'ai pas d'erreur ...

          -
          Edité par Benzouye 15 novembre 2017 à 10:57:32

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            15 novembre 2017 à 10:59:04

            J'ai une erreur enfin :

             Can't update table 'test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. SQL.sql 1 13

            -
            Edité par Thomas39100 15 novembre 2017 à 11:02:26

            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2017 à 11:33:24

              C'est bien ce qu'il me semblait :p

              Au sein d'un TRIGGER, tu ne peux pas agir sur la table sur laquelle il est placé ... pour éviter de créer des boucles infinies ...

              Ton TRIGGER est placé sur la table test2.test, tu ne peux donc rien faire sur cette table (INSERT, UPDATE ou DELETE).

              Je pense que tu vas être obligé de passer par une procédure plutôt qu'un TRIGGER ...

              Exemple :

              CREATE PROCEDURE insert_move_delete ( p_id, p_chemin )
              BEGIN
                  INSERT INTO test2.test VALUES ( p_id, p_chemin );
              
                  DELETE FROM test.recup;
              
                  INSERT INTO test.recup ( ... ) SELECT ...;
              
                  DELETE FROM test2.test;
              END

              Et au lieu d'exécuter ta requête INSERT INTO tu appelles ta procédure :

              CALL insert_move_delete( 'id', 'GET /...' );

              Bon, cela dit je m'interroge grandement sur l'intérêt d'une telle manoeuvre ... Si tu ne conserve rien dans la test2.test, autant insérer directement dans la test.recup ... Mais ça ... c'est ta sauce ...

              -
              Edité par Benzouye 15 novembre 2017 à 11:33:39

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                15 novembre 2017 à 11:37:41

                Le problème, c'est que je reçois une trame dans test2.test et que je dois retirer les infos de ma tram id, lat, lng etc... et l'enregistrer dans une autre bdd et table mais à chaque nouvelle trame elle me réenregistre tous depuis le début donc 1 trame - 1 trame j'en ais 4 d'enregistrer déjà merci je vais essayer cette procédure =)

                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2017 à 11:43:26

                  Thomas39100 a écrit:

                  je reçois une trame dans test2.test

                  Qui exécutes la requête d'insertion de ces données ? Une application tierce ? Un code sur lequel tu as la main ?

                  Si tu récupères toi-même la fameuse trame, tu pourrais tout à fait la décortiquer directement et la stocker où bon te semble sans passer par deux bases et deux tables ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    15 novembre 2017 à 11:48:26

                    On ne peut pas toucher au code, car on reçoit du gsm, de l'iridium, du sigfox, etc... et tjrs sous forme de trame mais pas les mêmes données (latitude des fois degré, etc...).

                    Je n'ai pas accès aux codes, c'est pour cela que j'ai une bdd qui reçois toutes les trames et qui les dispatch sur plusieurs bdd (par rapport au site internet qui va utiliser tel type de trame).

                    la procédure donnerais cette forme alors?

                    CREATE DEFINER = 'root'@'localhost'
                    PROCEDURE test2.insert_move_delete(p_id, p_chemin)
                    BEGIN
                        INSERT INTO test2.test VALUES ( p_id, p_chemin );
                     
                        DELETE FROM test.recup;
                     
                        INSERT INTO test.recup (idbalise, latitude, longitude, rayon, time, nbmsg) 
                    
                    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'ID=', -1), '&', 1),
                    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'LAT=', -1), '&', 1),
                    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'LNG=', -1), '&', 1),
                    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'RAYON=', -1), '&', 1),
                    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'TIME=', -1), '&', 1),
                    SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'NBMSG=', -1), ' HTTP', 1)
                    FROM test  ;
                     
                        DELETE FROM test2.test;
                    END

                    et dans mon trigger ceci

                    BEGIN 
                    CALL insert_move_delete( 'id', 'GET /...' );
                    END




                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 novembre 2017 à 11:54:19

                      Thomas39100 a écrit:

                      et dans mon trigger ceci

                      BEGIN 
                      CALL insert_move_delete( 'id', 'GET /...' );
                      END

                      Cela ne fonctionnera pas non plus car tu appelles ta procédure au sein du TRIGGER ... Tu auras la même erreur ...

                      Il faut remplacer la requête INSERT INTO par ton appel à la procédure ... pas le choix ...

                      D'où ma question :

                      Benzouye a écrit:

                      Qui exécutes la requête d'insertion de ces données ? Une application tierce ? Un code sur lequel tu as la main ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        15 novembre 2017 à 12:00:17

                        c'est une application que ma boîte à développer eux même, mais le problème et l'enregistrement de trame, car j'aurais plusieurs tables dans ma bdd et donc plusieurs trigger différent :)


                        -
                        Edité par Thomas39100 15 novembre 2017 à 12:00:46

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 novembre 2017 à 12:21:52

                          Je ne comprends toujours pas ... désolé :p

                          Une application (sur laquelle tu n'as pas la main) exécutes des requêtes INSERT INTO dans une table (sur laquelle je suppose que tu n'as pas la main non plus). Mais les données insérées dans cette table doivent être déplacées dans une autre table et supprimées de la table d'origine ...

                          Pourquoi ne pas dire aux développeurs que leurs requêtes INSERT INTO est inutile et qu'elles devraient être modifiée ? pour exécuter à la place un appel de procédure ...

                          Après si tout cela n'est pas envisageable (pour des raisons que toi seul connaît), peux-tu clarifier le rôle de ta deuxième table recup ? Qui va utiliser ces données qui sont supprimées à chaque nouvelle insertion ? Une autre application ? Sur laquelle tu as la main ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            15 novembre 2017 à 13:39:15

                            Ils n'ont pas le temps d'y retoucher (changement de projet pour eux) ^^

                            La deuxième table recup permettra d'afficher les données de ma trame dans plusieurs champ (Pour un meilleur traitement par la suite).

                            Pour la table recup je n'aurais plus besoin du delete form test.recup si j'arrive à vider la table dans test2.test.

                            Après ces données vont être vue par un utilisateur et gérer par un administrateur et de la bdd jusqu'au site j'aurais la main.

                            La contrainte et de réussir à enregistrer la trame dans test.recup et ensuite de vider la table test2.test

                            Je veux vider la table dans test2.test car si j'ai 4 enregistrement, dans test.recup ça en enregistrera 4 après si nouveau enregistrement ça réenregistreras le tous.

                            EDIT :

                            Voilà ce que cela fait et après en prod la table test2 (autre nom en prod) enverras sur bdd test - test3 - test4 etc...



                            -
                            Edité par Thomas39100 15 novembre 2017 à 13:44:31

                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 novembre 2017 à 13:49:09

                              Et peux-tu modifier la table test2.test ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                15 novembre 2017 à 13:54:19

                                La table sera visualisé comme ça id et data

                                Car la table test2.test c'est là ou le logiciel enregistreras la trame quand on la recevra.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 novembre 2017 à 14:11:10

                                  Bon ... je ne comprends toujours pas tes contraintes et l'objectif de ta demande ...

                                  Je vais faire une proposition quand même pour ton TRIGGER AFTER INSERT ON test2.test ...

                                  BEGIN
                                  	INSERT INTO test.recup(idbalise, latitude, longitude, rayon, time, nbmsg)
                                  	VALUES (
                                  		SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'ID=', -1), '&', 1),
                                  		SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'LAT=', -1), '&', 1),
                                  		SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'LNG=', -1), '&', 1),
                                  		SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'RAYON=', -1), '&', 1),
                                  		SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'TIME=', -1), '&', 1),
                                  		SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'NBMSG=', -1), ' HTTP', 1)
                                  	);
                                  END

                                  Pas de DELETE, la table test2.test se remplie, et la table test.recup aussi. L'une contiendra toutes les trames brutes, l'autre toutes les trames décortiquées ...

                                  -
                                  Edité par Benzouye 15 novembre 2017 à 14:11:35

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                    15 novembre 2017 à 14:13:20

                                    C'est compliqué à expliquer le but, je suis désolé, cela marche niquel, mais le problème et que si une nouvelle trame s'ajoute à ma bd ça va réinsérer la nouvelle trame et l'ancienne, il ne prendra jamais la nouvelle trame arriver, mais toutes les trames de la table

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 novembre 2017 à 14:18:41

                                      Thomas39100 a écrit:

                                      si une nouvelle trame s'ajoute à ma bd ça va réinsérer la nouvelle trame et l'ancienne

                                      Non ! Seulement la nouvelle car je n'utilise pas un SELECT ... FROM test2.test, mais seulement les données du nouvel enregistrement via la pseudo table NEW ...

                                      Par contre, les deux tables contiendront toutes les trames ...

                                      -
                                      Edité par Benzouye 15 novembre 2017 à 14:19:04

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                        15 novembre 2017 à 14:23:22

                                        La table test2.test doit contenir les trames "brut - complète" et la table dans test.recup doit contenir toutes les trames de test2.test mais avec :

                                        SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'ID=', -1), '&', 1),
                                        SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'LAT=', -1), '&', 1),
                                        SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'LNG=', -1), '&', 1),
                                        SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'RAYON=', -1), '&', 1),
                                        SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'TIME=', -1), '&', 1),
                                        SUBSTRING_INDEX(SUBSTRING_INDEX(datatest, 'NBMSG=', -1), ' HTTP', 1)

                                        Je dois décomposer chaque trame quand elle arrive et la réenregistrer dans une nouvelle table en récupérant que les infos importantes, je ne connais pas le NEW par contre je vais regarder

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          15 novembre 2017 à 14:31:06

                                          Thomas39100 a écrit:

                                          Je dois décomposer chaque trame quand elle arrive et la réenregistrer dans une nouvelle table en récupérant que les infos importantes

                                          J'avais bien compris et ce que fait le TRIGGER que je te propose dans mon dernier message ...

                                          Essaye et tu verras ;)

                                          -
                                          Edité par Benzouye 15 novembre 2017 à 14:31:52

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                            15 novembre 2017 à 14:32:39

                                            Ouai, mais le problème, c'est que ce que tu ma passé réenregistre toute la table à chaque fois et pas que le dernier arrivé et je bloque là, si j'y arrive tout mon problème sera résolu.

                                            EDIT : je viens de mettre mon code ça enregistre que le dernier arrivé, c'est pile ce que je voulais en fait c'etait de le form test qui reprenait tous merci beaucoup à toi =)

                                            -
                                            Edité par Thomas39100 15 novembre 2017 à 14:36:05

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              15 novembre 2017 à 14:38:57

                                              Thomas39100 a écrit:

                                              se que tu ma passé réenregistre toutes la table à chaque fois

                                              Non ...

                                              Benzouye a écrit:

                                              Non ! Seulement la nouvelle car je n'utilise pas un SELECT ... FROM test2.test, mais seulement les données du nouvel enregistrement via la pseudo table NEW ...

                                              Je reposte le code :

                                              BEGIN
                                                  INSERT INTO test.recup(idbalise, latitude, longitude, rayon, time, nbmsg)
                                                  VALUES (
                                                      SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'ID=', -1), '&', 1),
                                                      SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'LAT=', -1), '&', 1),
                                                      SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'LNG=', -1), '&', 1),
                                                      SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'RAYON=', -1), '&', 1),
                                                      SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'TIME=', -1), '&', 1),
                                                      SUBSTRING_INDEX(SUBSTRING_INDEX( NEW.datatest, 'NBMSG=', -1), ' HTTP', 1)
                                                  );
                                              END

                                              Tu vois bien ici que l'insertion ne concerne qu'une seule ligne, seulement celle qui vient d'être insérée (dont on retrouve les données via NEW) ...

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                15 novembre 2017 à 14:39:59

                                                Oui, j'avais édité mon message suite à l'erreur, je te remercie beaucoup du temps et de la patiente que tu as eu, tu me sauves la vie =)

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                vider table dans un trigger

                                                × 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