如何在MySQL中迴圈遍歷表的所有行?


要迴圈遍歷表的所有行,請在MySQL中使用儲存過程。語法如下:

delimiter //
CREATE PROCEDURE yourProcedureName()
BEGIN
DECLARE anyVariableName1 INT DEFAULT 0;
DECLARE anyVariableName2 INT DEFAULT 0;
SELECT COUNT(*) FROM yourTableName1 INTO anyVariableName1;
SET anyVariableName2 =0;
WHILE anyVariableName2 < anyVariableName1 DO
   INSERT INTO yourTableName2(yourColumnName,...N) SELECT (yourColumnName1,...N)
FROM yourTableName1 LIMIT anyVariableName2,1;
   SET anyVariableName2 = anyVariableName2+1;
END WHILE;
End;
//

為了理解上述語法,讓我們建立兩個表,一個表包含記錄,第二個表將使用儲存過程從迴圈中獲取記錄。

以下是建立第一個表的查詢:

mysql> create table AllRows
   -> (
   -> Id int,
   -> Name varchar(100)
   -> );
Query OK, 0 rows affected (0.46 sec)

使用insert命令在第一個表中插入一些記錄。查詢如下:

mysql> insert into AllRows values(1,'John');
Query OK, 1 row affected (0.12 sec)

mysql> insert into AllRows values(100,'Carol');
Query OK, 1 row affected (0.13 sec)

mysql> insert into AllRows values(300,'Sam');
Query OK, 1 row affected (0.15 sec)

mysql> insert into AllRows values(400,'Mike');
Query OK, 1 row affected (0.20 sec)

使用select語句顯示錶中的所有記錄。查詢如下:

mysql> select *from AllRows;

輸出

+------+-------+
| Id   | Name  |
+------+-------+
|    1 | John  |
|  100 | Carol |
|  300 | Sam   |
|  400 | Mike  | 
+------+-------+
4 rows in set (0.00 sec)

以下是建立第二個表的查詢:

mysql> create table SecondTableRows
   -> (
   -> StudentId int,
   -> StudentName varchar(100)
   -> );
Query OK, 0 rows affected (0.54 sec)

現在您可以使用儲存過程迴圈遍歷表的所有行。儲存過程如下:

mysql> delimiter //
mysql> CREATE PROCEDURE Sp_AllRowsOfATable()
   -> BEGIN
   -> DECLARE lastRows INT DEFAULT 0;
   -> DECLARE startRows INT DEFAULT 0;
   -> SELECT COUNT(*) FROM AllRows INTO lastRows;
   -> SET startRows=0;
   -> WHILE startRows <lastRows DO
   -> INSERT INTO SecondTableRows(StudentId) SELECT (Id) FROM AllRows LIMIT
startRows ,1;
   -> SET startRows= startRows+1;
   -> END WHILE;
   -> End;
   -> //
Query OK, 0 rows affected (0.22 sec)
mysql> delimiter ;

使用CALL命令呼叫儲存過程。語法如下:

CALL yourStoredProcedureName;

呼叫上述儲存過程以迴圈遍歷第一個表的所有行。查詢如下:

mysql> call Sp_AllRowsOfATable();
Query OK, 1 row affected (0.61 sec)

呼叫儲存過程後,讓我們檢查第二個表發生了什麼變化。查詢如下:

mysql> select StudentId from SecondTableRows;

輸出

+-----------+
| StudentId |
+-----------+
|         1 |
|       100 |
|       300 |
|       400 |
+-----------+
4 rows in set (0.00 sec)

更新於:2019年7月30日

7K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告