如何在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)
廣告