Partage
  • Partager sur Facebook
  • Partager sur Twitter

requete-SQl mis à jour

Sujet résolu
    26 avril 2021 à 20:13:19

    Bonjour ,

    j'ai une procédure SQl qui s'charge à détecter des xx qui sont dans une table t1 puis les insère dans une table t2 (bien sur selon un autre nom) selon des conditions.

    ma procédure est de genre: 

    replace into t2 .... select ..from t1..where ..

    mon problème maintenant est :que les données dans la table t1 peuvent être mis à jour comme les dates ,et si ces nouvelles donnés ne respectent pas les conditions de la requête de procédure donc elle ne doivent pas s'insérer dans t2 ..

    Comment puis-je de faire en sorte que si je mis à jour (ou modifier)les colonnes de la table t1 ,ca modifie(mis à jour) aussi les colonnes qui le correspondent dans la table t2  en SQl svp ?

    Merci pour votre aide 

    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2021 à 23:23:39

      Bonjour,

      Cela va être très compliqué de t'aider si tu ne nous présentes pas exactement les deux tables en question, avec un exemple de données de ce que tu cherches à faire...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        27 avril 2021 à 0:50:42

        ma procédure est de genre
        replace into t2 .....
          
        select a ,b , 1 from FROM tables.t1 as table1 
               LEFT JOIN tables.t1 as table2 USING(commun) where table1.z!=table2.z
                 union
                 select a ,b ,2 from tables.t1 as table1 
               LEFT JOIN tables.t1 as table2 USING(commun) where table1.z!=table2.z and table1.z > 2

        désolée que je ne peux partager le bon code.

        Je vais essayer de vous expliquer la situation au maximum ...

        Imaginons , sur un reseau social comme facebook.

        On a une table t1 ou on Insère toutes les info d'un profil donné , pour une raison ou une autre on souhaite extraire les profil avec un truc commun ..et les insérer dans une autre table t2.

        Donc on fait select * from t1 where commun=1 ;

        Ceci va m'afficher 2 lignes colonne contentant chacune des informations.(j'insiste sur le fait d'afficher 2ligne colonne parce que c'est ce que fait mon code) cette table t1 contient une colonne date "mis à jour" qui est un timestamp ..que chaque fois je modifie manuellement (ou en code) une colonne dans t1 ca m'affiche la date mis à jour à cet instant..

        On veut assembler ces deux lignes colonnes dans une seule ligne colonne mais cette fois on l'insère dans t2.. la table t2 contient aussi une date nomé "derniere" qui désigne la date de mis à jour ...

        Maintenant si je fais : select * from t1 where commun=1 ; ca m'affiche 2lignes colonnes ok puis select * from t2 where commun=1 ; affiche une ligne colonne assemble les info des deux colonne précédentes ( c'est ce que ma procédure fait) ainsi l'historique .

        Maintenant si je modifie une colonne dans la table t1..et je sauvegarde ..et appel à ma procédure devra modifier la colonne qui lui correspond aussi dans la table t2..et le résultat qui affiche tous l'historique de toutes les modifications ...

        Je veux modifier ma procédure de sorte que les conditions restent les mêmes; même après la mis à jour , genre avant d'insérer directement dans t2.. la procédure devra gérer le cas s'il y'a une mis à jour dans t1 et vérifier les conditions pour insérer ..si y'a une mise à jour dans t1 et les conditions sont pas respect il doit pas insérer dans t2 sinon il insère .. paracerque pour l'instant comme vous pouvez le voir la procédure insère dans tous les cas de conditions ..

        j'espère c plus clair , merci de votre aide

        -
        Edité par Benzouye 27 avril 2021 à 11:07:25

        • Partager sur Facebook
        • Partager sur Twitter
          27 avril 2021 à 11:09:45

          Ce que je ne comprends pas dans ton explication c'est le pourquoi ...

          Pourquoi s'embêter à mettre à jour des données dupliquées ?

          Pour ma part, je verrai plutôt une nouvelle insertion avec une nouvelle date pour garder l'historique ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            27 avril 2021 à 12:57:22

            c'est la table qui est faite ainsi , elle m'est ai donnée
            • Partager sur Facebook
            • Partager sur Twitter
              27 avril 2021 à 13:32:31

              Ne peux-tu pas faire un TRIGGER AFTER INSERT OR UPDATE ON table1 plutôt que cette procédure chelou ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                27 avril 2021 à 13:48:25

                justement j'ai essayé de faire un trigger  mais j'ai erreur updating of new row is not allowed ..

                Après le but  c'est d'améliorer la procedure , elle devra prendre en compte que les lignes modifiés

                CREATE TRIGGER mis_a_jour AFTER UPDATE 
                ON t1 FOR EACH ROW
                BEGIN 
                IF NEW.Date IS NOT NULL
                THEN 
                	SET  NEW.Date = NULL
                END IF;
                END;
                $$
                
                DELIMITER ;
                • Partager sur Facebook
                • Partager sur Twitter
                  27 avril 2021 à 15:02:32

                  Mais ce n'est pas la table 2 que tu veux mettre à jour ?

                  Ton TRIGGER serait plutôt :

                  DELIMITER $$
                  
                  CREATE TRIGGER mis_a_jour
                  AFTER UPDATE ON table1
                  FOR EACH ROW
                  BEGIN
                      IF ... THEN
                          UPDATE table2
                          SET ...
                          WHERE ...
                      END IF;
                  END$$
                  
                  DELIMITER ;

                  Remplace les ... par les conditions souhaitées ...

                  Cela à l'avantage d'éviter la procédure et n'agit que sur les lignes modifiées ...

                  -
                  Edité par Benzouye 27 avril 2021 à 15:03:12

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    27 avril 2021 à 15:47:40

                    et si je veux faire ca dans la procédure comment puis-je procéder?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 avril 2021 à 17:07:48

                      Pourquoi ? Tu ne peux pas utiliser de TRIGGER ?

                      L'avantage du TRIGGER c'est qu'il connait la ligne de la table1 que l'on vient de modifier donc tu sais ce qu'il va falloir faire sur la table2 ...

                      Par une procédure cela t'oblige à parcourir toute la table à la recherche d'écarts ... c'est quasiment mission impossible ...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        27 avril 2021 à 17:58:43

                        non c'est pas question que je ne peux pas .

                        Question que je ne peux supprimer la procedure 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 avril 2021 à 18:13:34

                          Mais ta procédure se lance périodiquement, sans aucun lien avec un UPDATE ou un INSERT ... donc il est impossible au sein de la procédure de déterminer quelles lignes ont été mises à jour depuis la dernière exécution ...

                          Si tu ne peux déroger à la procédure existante, il faut y mettre en place une comparaison "ligne à ligne" entre les deux tables pour déterminer quoi faire ...

                          Est-ce que tu sais expliquer en toutes lettres (avec des mots), ce qui te permet de déterminer quoi mettre à jour ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            27 avril 2021 à 20:05:34

                            tu sais ce que je suis entrain de faire , je vais essayer de créer un trigger qui se déclenche une fois une colonne est mis à jour .

                            une fois c'est mis à jour, j'exécute la procedure ...Que pensez vous ?

                            je ne sais pas si ca va marcher 

                            CREATE OR REPLACE TRIGGER Mis_a_jour 
                            AFTER UPDATE ON "t1" 
                            FOR EACH ROW 
                            begin
                              dbms_output.put_line ('test1_trigger1');
                              if :old.Date <> :new.Date  then
                                dbms_output.put_line ('column1 date_');
                              execute  procedure 
                              end if;
                            
                              NULL;
                            END;
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 avril 2021 à 9:52:19

                              Je ne sais pas si ta procédure existante prend des paramètres en entrée, mais si elle n'en prend pas, ou si elle ne prend pas les bons, tu ne pourras pas savoir au sein de la procédure ce qu'il faut modifier ...

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                28 avril 2021 à 17:12:10

                                si maintenant en fait j'aimerai supprimer l'historique (les lignes avant l'appel de procedure) comment faire ?

                                au départ suppostant ma t2 est vide ..j'appele la procédure ..ca m'insere une ligne dans t2 c'est ok ...Maintennant je fais une mise à jour à une colonne dans t1 ..j'appelle la procédure.. y'a une nouvelle ligne qui m'affiche et l'ancienne ...je veux garder que la dernière .. comment puis-je faire ?

                                -
                                Edité par test39 28 avril 2021 à 17:22:00

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 avril 2021 à 18:39:55

                                  Un DELETE avec les bonnes conditions ... Mais sans connaitre la structure réelle de la base et quelques exemples de données, je ne peux rien dire de plus ...

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

                                  requete-SQl mis à jour

                                  × 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