Partage
  • Partager sur Facebook
  • Partager sur Twitter

Addition de plusieurs colonnes vers autre MySQL

Sujet résolu
    6 mars 2023 à 20:16:48

    Bonjour tout le monde.

    -
    Edité par (...) 9 juin 2023 à 12:02:35

    • Partager sur Facebook
    • Partager sur Twitter
      7 mars 2023 à 10:38:45

      Plutôt ça non ?:

      CREATE TABLE `MyTable` (
        `id` int(11) NOT NULL,
        `ColonneA` time NOT NULL,
        `ColonneB` time NOT NULL,
        `ColonneC` time NOT NULL,
        `CIColonne` time AS (ColonneA + ColonneB + ColonneC) STORED
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


      Edit: Ah mal lu j'ai pas vu que tu avais essayé

      -
      Edité par Kévin Brissez 7 mars 2023 à 10:39:37

      • Partager sur Facebook
      • Partager sur Twitter
        7 mars 2023 à 12:04:30

        Oui

        -
        Edité par (...) 9 juin 2023 à 12:02:44

        • Partager sur Facebook
        • Partager sur Twitter
          7 mars 2023 à 13:12:57

          Mais après si tu fais avec le code ci-dessus ta pas besoin de trigger, donc as-tu essayer le code plus haut sans mettre de trigger ?
          • Partager sur Facebook
          • Partager sur Twitter
            7 mars 2023 à 14:54:38

            Alors ça marche sur PHPMyAdmin cette fois,  affiche la modification sur mon interface en PHP.

            Mais il m'est toujours impossible d'ajouter ou de modifier depuis mon formulaire, renvoyant l'erreur 1906 citée plus haut.

            • Partager sur Facebook
            • Partager sur Twitter
              8 mars 2023 à 10:47:28

              Salut

              Peut-on voir les deux requêtes de création et de mise à jour ?

              Je me demande si cela fonctionne sans lister ni toucher à la colonne calculée, plutôt que de mettre NULL ou DEFAULT.

              • Partager sur Facebook
              • Partager sur Twitter
                8 mars 2023 à 17:35:16

                Bonjour et merci pour ta rapide réponse.

                -
                Edité par (...) 9 juin 2023 à 12:02:56

                • Partager sur Facebook
                • Partager sur Twitter
                  8 mars 2023 à 21:00:38

                  Et par rapport à la dernière phrase de mon précédent message, as-tu testé ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 mars 2023 à 9:02:47

                    Oui, tout à fait : toujours le même message d'erreur renvoyé.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 mars 2023 à 9:40:43

                      OK, je pense que ce genre de souci n'étant pas lié à PHP (tu le dis toi-même, avec phpMyAdmin tu as la même erreur), il pourrait être intéressant de :

                      • soit expliquer le problème dans un nouveau sujet dans le forum des bases de données ;
                      • soit le nettoyer du code PHP et de demander en signalant un des messages à ce que la discussion soit déplacée dans cet autre forum.

                      -
                      Edité par Ymox 10 mars 2023 à 14:39:28

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mars 2023 à 12:33:26

                        Bonjour, Je déplace le sujet à la demande de l'auteur.

                        Déplacement vers un forum plus approprié

                        Le sujet est déplacé de la section PHP vers la section Base de données

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 mars 2023 à 9:16:37

                          Hello,

                          Personnellement soit je ferai bêtement le calcul dans mon code php pour ne pas avoir à stocker cette valeur dans la base (c'est redondant niveau data et ca dégrade les perfs d'avoir des triggers à l'insert ou update).

                          Et si tu veux pas faire ca en PHP, pourquoi ne pas simplement te faire une vue qui fait le calcul a ta place ?

                          CREATE VIEW myView AS
                          SELECT 
                           ColonneA,
                           ColonneB,
                           ColonneC,
                           ColonneA + ColonneB + ColonneC as CIColonne
                          FROM myTable


                          Sinon j'avoue que ton code de création de table me perturbe

                          CREATE TABLE `MyTable` (
                            `id` int(11) NOT NULL,
                            `ColonneA` time NOT NULL,
                            `ColonneB` time NOT NULL,
                            `ColonneC` time NOT NULL,
                            `CIColonne` time AS (charge_s_fab + charge_s_rect + charge_s_mep)
                          ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


                          C'est quoi ces charge_s_fab,  charge_s_rect, charge_s_mep ?

                          Ensuite j'avoue ne m'être jamais servi de ce genre de table, mais imaginons que cette structure fonctionne, pourquoi spécifier une valeur à l'insertion et à l'update si la valeur de la colonne est sensée se calculer toute seule ?

                          -
                          Edité par Tiffado 20 mars 2023 à 9:27:58

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 mars 2023 à 17:27:28

                            euh si tu récupères la valeur de CIColonne dans ton POST, quel intérêt de la calculer ? (sachant que tu la passes aussi en paramètre de ton INSERT, de plus en 1ère position). Pour moi, ce n'est pas cohérent.

                            -
                            Edité par umfred 20 mars 2023 à 17:27:38

                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 mars 2023 à 10:41:45

                              ..

                              -
                              Edité par (...) 9 juin 2023 à 12:07:56

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 mars 2023 à 11:23:49

                                Oui non mais je me doute de ce que c'est derriere, mais mettre dans ton code de création de table, comment est-ce que ca peut comprendre à quoi ces 3 valeurs font référence ?

                                Sinon, que penses tu des autres remarques ?

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 mars 2023 à 15:51:30

                                  C'est que

                                  -
                                  Edité par (...) 9 juin 2023 à 12:08:04

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 mars 2023 à 9:19:36

                                    L'idée de la vue ne te plait pas ? 

                                    Si c'est le cas, c'est quoi son soucis ?

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      27 mars 2023 à 18:34:46

                                      Bonsoir,

                                      L’utilisation des Generated Columns est la plus approprié dans ton cas :

                                      https://mariadb.com/kb/en/generated-columns

                                      Si tu veux pas utiliser ça, une vue est la 2e meilleure solution effectivement.

                                      -
                                      Edité par lecbee 27 mars 2023 à 18:35:18

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 mars 2023 à 21:48:56

                                        Oui

                                        -
                                        Edité par (...) 9 juin 2023 à 12:08:17

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          28 mars 2023 à 9:46:33

                                          Redonne nous ton code de création de table stp, et les requêtes que tu tentes.

                                          Genre une requête d'insertion manuelle, pas avec ton formulaire. Quand on est confronté à un problème, il faut toujours faire en sorte d'écarter un maximum de choses qui peuvent nuire à ton test.

                                          La tu parles de vue et de GENERATED en même temps, sauf que c'est l'un ou l'autre, pas les 2. Si tu as un soucis avec la column GENERATED, c'est que tu gères ca mal (d'ou le besoin de voir ton code), et donc la vue par dessus ne changera rien.

                                          je reste sceptique sur ta création de table 

                                          CREATE TABLE `MyTable` (
                                            `id` int(11) NOT NULL,
                                            `ColonneA` time NOT NULL,
                                            `ColonneB` time NOT NULL,
                                            `ColonneC` time NOT NULL,
                                            `CIColonne` time AS (charge_s_fab + charge_s_rect + charge_s_mep)
                                          ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
                                          

                                          ca devrait être, comme tu as pu le voir à la toute 1ere réponse que tu as reçu :

                                          CREATE TABLE `MyTable` (
                                            `id` int(11) NOT NULL,
                                            `ColonneA` time NOT NULL,
                                            `ColonneB` time NOT NULL,
                                            `ColonneC` time NOT NULL,
                                            `CIColonne` time AS (ColonneA + ColonneB + ColonneC)
                                          ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
                                          

                                          Parce que ton "charge_s_fab + charge_s_rect + charge_s_mep", c'est inconnu de la SGBD, il ne connait pas ces valeurs.

                                          J'ai clairement l'impression que tu te mélanges les pinceaux. Tu tentes du GENERATED, du TRIGGER, une vue, etc ... mais quand tu veux essayer une nouvelle solution, il faut que tu repartes d'un code qui fonctionne. En soit le trigger peut fonctionner aussi (meme si c'est sale), mais pour ca il faut une table fonctionnelle derrière, si ta table de base ne fonctionne pas, c'est pas un trigger en + qui va corriger.


                                          je vois aucun soucis

                                          -
                                          Edité par Tiffado 28 mars 2023 à 10:07:23

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            28 mars 2023 à 12:36:45

                                            Oui,

                                            -
                                            Edité par (...) 9 juin 2023 à 12:08:27

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              28 mars 2023 à 12:39:00

                                              Euh, non. désolé.

                                              Montre ton code ici stp, avec ta version actuelle.

                                              Pour rappel, et comme ca a été déjà dit au moins 2 fois ici, cette requete ci ne fonctionnera pas :

                                              $query = "INSERT INTO myTable (
                                                        CIColonne,
                                                        ColonneA,
                                                        ColonneB,
                                                        ColonneC
                                                        )
                                                    VALUES (
                                                        :CIColonne,
                                                        :ColonneA,
                                                        :ColonneB,
                                                        :ColonneC
                                                        )";

                                              Le concept de la colonne GENERATED est que sa valeur se calcule seule, donc il NE FAUT PAS lui spécifier de valeur. D'autant plus que tu as un id dans ta table, qui n'est pas auto incrémenté, donc tu dois lui en donner un lors de l'INSERT.

                                              -
                                              Edité par Tiffado 28 mars 2023 à 12:51:54

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                28 mars 2023 à 13:10:17

                                                Voici le code :

                                                -
                                                Edité par (...) 9 juin 2023 à 12:08:46

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  28 mars 2023 à 13:18:31

                                                  Ok, mise à part le fait que tu pourrais rajouter tes contraintes d'intégrité lors du CREATE plutot que d'ALTER, et aussi que ca serait bien de pas faire les INSERT avant de faire les ALTER, y'a quoi qui fonctionne pas ici ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    28 mars 2023 à 13:24:47

                                                    Comme

                                                    -
                                                    Edité par (...) 9 juin 2023 à 12:08:55

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      28 mars 2023 à 13:33:05

                                                      Comme je l'ai dit plus haut, ce qui ne fonctionne pas, c'est que lors que tu as une colonne GENERATED, il NE FAUT PAS lui spécifier de valeur :

                                                      $query = "UPDATE myTable
                                                                SET
                                                                CIColonne=:CIColonne,
                                                                ColonneA=:ColonneA,
                                                                ColonneB=:ColonneB,
                                                                ColonneC=:ColonneC
                                                                WHERE id=:myTable_id LIMIT 1";


                                                      Donc ton INSERT ici ne peut pas fonctionner.

                                                      EDIT : 

                                                      Pour refaire une réponse + complète.

                                                      Tu veux un champ qui se calcul automatiquement à partir de 3 autres. Ca se fait tout simplement avec la méthode de création de table vue + haut, la colonne GENRATED.

                                                      Cette colonne étant calculée à la volée par le SGBD, tu ne peux pas lui donner de valeur toi même. A chaque fois que tu vas toucher à ta donnée en table, le SGBD va recalculer la valeur de cette colonne automatiquement, que ce soit en INSERT ou UPDATE.

                                                      Donc à ton SELECT, ta colonne aura la bonne valeur.

                                                      Cette valeur tu vas l'afficher dans ton form. Le soucis, c'est que si tu modifies les champs de ton form, genre la colonneA, alors ton champ calculé se remet pas à jour tout seul (dans le formulaire hein). Si tu veux que ton input soit à jour, ca sera à faire en JS par exemple. Mais lorsque tu voudras update tes nouvelles valeurs en base, tu dois ignorer ce que ce que ton input contient. Tu ne vas update que les valeurs ColonneA, B et C. La CIColonne se recalculera toute seule.

                                                      -
                                                      Edité par Tiffado 28 mars 2023 à 13:53:31

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        28 mars 2023 à 14:03:08

                                                        Contre toute attente, ÇA MARCHE !!!

                                                        J

                                                        -
                                                        Edité par (...) 9 juin 2023 à 12:11:55

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          28 mars 2023 à 14:16:38

                                                          Comment ça, contre toute attente ?

                                                          Ca fait 3 fois qu'on te le dit...

                                                          Si tu veux calculer une soustraction entre 2 champs de 2 tables, il va déjà commencer par pouvoir faire le lien entre tes 2 tables.

                                                          Pas de Foreign Key => pas de lien entre tes tables => pas de soustraction 

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            28 mars 2023 à 15:00:52

                                                            ??

                                                            -
                                                            Edité par (...) 9 juin 2023 à 12:12:04

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              28 mars 2023 à 15:21:00

                                                              C'est pas un soucis de PHP, c'est un soucis de modélisation de ta base de données.

                                                              Mais la, on parle des fondamentaux d'une base de données.

                                                              Je vais pas te faire un cours la comme ca, je t'invite à aller revoir un cours sur la modélisation des bases de données, en particulier sur les Primary key et les foreign key.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Addition de plusieurs colonnes vers autre 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