sql >> データベース >  >> RDS >> Mysql

ストアドプロシージャを使用せずにn回ループする

    フロー制御ステートメント に関するMySQLドキュメント 言う:

    ストアドプログラムとビュー に関するドキュメント 言う:

    Compound-Statement構文

    したがって、ストアドプロシージャ、関数、またはトリガー内でのみ明示的なループを実行できるようです。

    SQLステートメントで行うことによっては、数値のテーブル(またはビュー)を使用できる場合があります(mysqlでの「数値テーブル」の作成 MYSQL:連続番号テーブル )。

    クエリがSELECTの場合 SELECTの結果を返すことはOKです 1つの長い結果セットの10倍(10の個別の結果セットとは対照的に)次のようなことができます:

    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
    

    INSERTの例

    データベースに永続的な数値の表を用意することをお勧めします。多くの場合に役立ちます。生成方法については、上記のリンクをご覧ください。

    したがって、テーブルNumbersがある場合 intを使用 列Number 1からたとえば100Kまでの値(私が行うように)、およびこの列の主キーを使用して、このループの代わりに:

    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;
    

    あなたが書くことができます:

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

    また、ほぼ10倍高速に動作します。



    1. 本番PostgreSQLデータベースの管理を容易にする

    2. 1つのPostgreSQLクエリで複数のWITHステートメントを使用するにはどうすればよいですか?

    3. psqlの代替出力形式

    4. MySqlトリガーでINSERT操作を中止するにはどうすればよいですか?