Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajouter un nombre important d'entrée en une requête

Est-ce possible ?

Anonyme
    18 juin 2011 à 16:33:44

    Bonjour,

    Je voulais savoir si il était possible d'ajouter par exemple 100 entrées dans une table en une seule requête ?
    Ma table serait toute bête : un id auto-incrémenté et une colonne qui comportera "1" ou "0", et qui comporte "0" par défaut. Donc en gros rien besoin de remplir.

    id etat
    1 0
    2 0
    ... ...
    100 0


    Est-ce possible ? Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2011 à 22:27:09

      Oui c'est possible. Construit en boucle une chaîne de caractères représentant ta future requête, et quand elle est prête lance-la. Voici la syntaxe typique à obtenir au final :

      INSERT INTO matable (champs1, champs2 champs3) VALUES
      (1, 2, 3),
      (1, 2, 3),
      ....
      (1, 2, 3);
      


      Note qu'on termine la requête par un point-virgule. Beaucoup de débutant l'oublient, celui-là, sous prétexte que hors du multi-query il est facultatif... :p
      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2011 à 23:27:06

        Avec quel SGBDR ?

        @Darth Killer : mouais... boucles en SQL, ça le fait pas vraiment pour faire ça, et les requêtes se terminent toujours par des ;.
        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2011 à 0:25:35

          Fayden : je parlais d'une boucle PHP qui créée la chaîne de caractères. Ou de tout autre méthode similaire.

          <?php
          $lignes = array();
          
          foreach(/*arguments */) {
             $lignes[] = array($id, $etat);
          }
          
          $lignes = array_map(
                   create_function ('$a', 'return (\'$a[0]\', \'$a[1]\');'),
                   $lignes);
          
          
          $query = sprintf('INSERT INTO matable (id, etat) VALUES %s;', implode(', ', $lignes));
          $pdo->exec($query);
          ?>
          


          Et pour les requêtes non-multi-query, le ; est, en pratique du moins, optionnel. C'est peut-être spécifique à MySQL ceci dit. Mais toujours est-il qu'à cause de ça, moi qui mets le ; systématiquement je reçois des messages de zéros comme quoi je me suis trompé...
          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2011 à 0:26:22

            Qu'est-ce qui te dit qu'il utilise PHP ? Il ne faut pas oublier qu'on se trouve sur le forum Base de données.
            • Partager sur Facebook
            • Partager sur Twitter
              19 juin 2011 à 0:27:26

              Vrai, mais en même temps je ne vois pas trop comment construire dynamiquement une requête avant de la lancer, si c'est sans passer par un autre langage serveur comme PHP ou ASP...
              • Partager sur Facebook
              • Partager sur Twitter
                19 juin 2011 à 0:59:52

                PostgreSQL par exemple :

                INSERT INTO table (col1, col2) SELECT n, 0 FROM generate_series(1,100) n;
                
                • Partager sur Facebook
                • Partager sur Twitter
                  19 juin 2011 à 7:20:53

                  Oh mais c'est pas mal comme syntaxe ça :o
                  'faudrait voir si MySQL et les autres ont des équivalents
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 juin 2011 à 12:35:26

                    Oracle a cela:
                    insert into table (col1, col2)
                    select rn, 0
                    from (select rownum rn
                          from dual
                          connect by level <= 100);
                    


                    Mais ce qui peut marcher avec MySQL (tous les SGBD en fait) c'est le bon vieux produit cartésien des familles:
                    insert into table (col1, col2)
                    select 1 + a.n + 10 * b.n, 0
                    from (select 0 n
                          union all select 1 n
                          union all select 2 n
                          union all select 3 n
                          union all select 4 n
                          union all select 5 n
                          union all select 6 n
                          union all select 7 n
                          union all select 8 n
                          union all select 9 n) a
                        cross join (select 0 n
                          union all select 1 n
                          union all select 2 n
                          union all select 3 n
                          union all select 4 n
                          union all select 5 n
                          union all select 6 n
                          union all select 7 n
                          union all select 8 n
                          union all select 9 n) b;
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 juin 2011 à 13:42:58

                      Sous MySQL j'ai toujours une table "serie" qui traîne avec les entiers de 1 à 1000000 dedans, ça peut servir.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Ajouter un nombre important d'entrée en une requête

                      × 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