MySQL は、「A のレコードごとに」のような行ごとのループ構文をネイティブにサポートしていませんが、反復するメカニズムを提供しています。テーブルの行を系統的に調べます。
1 つのアプローチは、個々の行を操作するプロシージャを作成することです。プロシージャは、クエリのように実行できるユーザー定義のコード ブロックです。以下はテーブル A 内の行をループする MySQL プロシージャです:
DROP PROCEDURE IF EXISTS ROWPERROW; DELIMITER ;; CREATE PROCEDURE ROWPERROW() BEGIN DECLARE n INT DEFAULT 0; DECLARE i INT DEFAULT 0; SELECT COUNT(*) FROM A INTO n; SET i=0; WHILE i<n DO INSERT INTO B(ID, VAL) SELECT (ID, VAL) FROM A LIMIT i,1; SET i = i + 1; END WHILE; End; ;; DELIMITER ; CALL ROWPERROW();
このプロシージャはテーブル A 内の行をカウントし、各行を反復処理してそのデータをテーブル B に挿入します。
もう 1 つの手法はカーソルを使用することです。これを使用すると、テーブルから行ごとにデータを取得できます。カーソルはプロシージャよりも行トラバースをより詳細に制御できますが、より冗長になることもあります。次の MySQL カーソルの例を考えてみましょう:
DROP PROCEDURE IF EXISTS cursor_ROWPERROW; DELIMITER ;; CREATE PROCEDURE cursor_ROWPERROW() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM A; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cursor_i; read_loop: LOOP FETCH cursor_i INTO cursor_ID, cursor_VAL; IF done THEN LEAVE read_loop; END IF; INSERT INTO B(ID, VAL) VALUES(cursor_ID, cursor_VAL); END LOOP; CLOSE cursor_i; END; ;; DELIMITER ; CALL cursor_ROWPERROW();
ここでは、テーブル A に対してカーソルが作成され、開かれています。 WHILE ループはカーソルから行をフェッチし、処理する行がなくなるまで処理します。
以上がMySQL テーブルの行を走査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。