Mysql
 sql >> Base de données >  >> RDS >> Mysql

Boucle n fois sans utiliser de procédure stockée

Documentation MySQL sur les Instructions de contrôle de flux dites :

Docs sur Programmes et vues stockés dites :

Syntaxe d'instruction composée

Ainsi, il semble que vous ne puissiez exécuter une boucle explicite que dans une procédure stockée, une fonction ou un déclencheur.

Selon ce que vous faites dans votre instruction SQL, il peut être acceptable d'utiliser une table (ou une vue) de nombres (Création d'une "table de nombres" dans mysql , MYSQL :table de nombres séquentiels ).

Si votre requête est un SELECT et c'est OK pour retourner le résultat de votre SELECT 10 fois comme un long ensemble de résultats (par opposition à 10 ensembles de résultats distincts), vous pouvez faire quelque chose comme ceci :

SELECT MainQuery.*
FROM
    (
        SELECT 1 AS Number 
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9
        UNION ALL SELECT 10
    ) AS Numbers
    CROSS JOIN
    (
        SELECT 'some data' AS Result
    ) AS MainQuery

Exemple pour INSÉRER

Je recommande d'avoir une table permanente de nombres dans votre base de données. Il est utile dans de nombreux cas. Voir les liens ci-dessus pour le générer.

Donc, si vous avez une table Numbers avec int colonne Number avec des valeurs de 1 à, disons, 100K (comme moi), et une clé primaire sur cette colonne, puis au lieu de cette boucle :

DECLARE count INT DEFAULT 0;
WHILE count < 10 DO
    INSERT INTO table_name(col1,col2,col3) 
    VALUES("val1","val2",count);

    SET count = count + 1;
END WHILE;

vous pouvez écrire :

INSERT INTO table_name(col1,col2,col3)
SELECT ("val1", "val2", Numbers.Number-1)
FROM Numbers
WHERE Numbers.Number <= 10;

Cela fonctionnerait également presque 10 fois plus vite.