【簡単】MySQL大量のinsert,update文を発行する方法

2020年1月27日

ストアドプロシージャって何?

MySQLで大量のデータをinsertやupdateするときなどに使うプロシージャのことです。

そもそもプロシージャとは、戻り値のない関数のことを言います。

下記に例を置いておきます。

DELIMITER //
CREATE PROCEDURE test()
BEGIN
DECLARE done int;
DECLARE $id int;
DECLARE $price int;
DECLARE cur CURSOR FOR select $id ,$price from table where conditions = 'test';
DECLARE EXIT HANDLER FOR NOT FOUND SET done = 0;
SET done = 1;
OPEN cur;
WHILE done DO FETCH cur INTO $id, $price;
insert into table values($id,$price,'test','test','test','test');
END WHILE;
CLOSE cur;
END;
//

初めて見る方は、なんだこれ、ってなるかもしれないですが、理解するのは凄く簡単です。

簡単に説明すると、

最初にdelimiter //

で区切り文字を「;」から「//」に変更しています。

これは、区切り文字を変更しなかった場合に、一行ごとにコマンドとして認識されるのを避けるために一旦区切り文字を変更しています。

わからない場合は、そういうもんだと思ってください。

プロシージャ名は、testです。

DECLAREは、変数の定義。

curという変数には、select文で取得してきた値が多次元配列として入っているとイメージしてください。

イメージ : cur = array($id => 取得した値の配列, $price => 取得した値の配列);

それを「WHILE done DO FETCH cur INTO $id, $price;」の部分で$idと$priceに各配列を入れ、whileで配列の値の回数、回しています。

イメージとしては、foreachをしている感じです。

これだけで複数のinsert、updateが可能になります。

環境によって変化する部分に赤文字にしてあるので、試してみてください。

 

プロシージャの実行、削除、確認

登録後に必ず実行する
DELIMITER ;

呼び出し
CALL [プロシージャ名]([引数]);

削除
DROP PROCEDURE [プロシージャ名];

登録済みのプロシージャを確認する
SHOW PROCEDURE STATUS;

 

IT, MySQL

Posted by took