MySQLのストアドプロシージャでテストデータを作る

テストデータを大量に作る際、サブクエリやシェルを書いたりしてましたが
ストアドプロシージャを使って作ってみました。

参考URL http://d.hatena.ne.jp/IT7C/20100801/1280596927

DROP PROCEDURE insert_generate_series;
DELIMITER ]]
CREATE PROCEDURE insert_generate_series(
    IN target VARCHAR(255),
    IN value VARCHAR(255),
    IN start_num INT,
    IN end_num INT,
    IN step INT
)
BEGIN
    SET @num:= start_num;
    SET @sql:= concat('INSERT INTO ',target,' VALUES ');
    SET SESSION sql_notes=0;
    DROP temporary TABLE IF EXISTS t_values;
    SET SESSION sql_notes=1;
    CREATE temporary TABLE t_values (val VARCHAR(255));
    SET @buf_size:=length(@sql);
    WHILE @num <= end_num DO
        SET @buf:=concat('(',REPLACE(value,'@num',@num),')');
        INSERT INTO t_values VALUES ( @buf );
        SET @buf_size:=@buf_size + LENGTH(@buf) + 1;
        SET @num:=@num + step;
    END while;
    SET SESSION group_concat_max_len=@buf_size;
    -- SET SESSION max_allowed_packet=@buf_size;
    SET @sql:= concat(@sql,(SELECT group_concat(val) FROM t_values));
    PREPARE stmt from @sql;
    EXECUTE stmt;
END;
]]
DELIMITER ;

データを追加する場合は以下のように実行

CALL insert_generate_series(
    'log(data,created_at,updated_at)',
    "concat(md5(@num),@num),'2011-10-01 05:00:00','2011-10-01 05:00:00'",1,10000,1);

その他使いそうなコマンドをメモ

-- プロシージャー一覧
SHOW PROCEDURE STATUS ;

-- プロシージャー詳細
SHOW PROCEDURE CODE insert_generate_series;

-- プロシージャー一覧と詳細
SELECT * FROM ROUTINES;