要遍历表的所有行,请使用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) -> );
使用insert命令在第一个表中插入一些记录。查询如下-
mysql> insert into AllRows values(1,'John'); mysql> insert into AllRows values(100,'Carol'); mysql> insert into AllRows values(300,'Sam'); mysql> insert into AllRows values(400,'Mike');
使用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) -> );
现在,您可以使用存储过程遍历表的所有行。存储过程如下-
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; -> // mysql> delimiter ;
使用CALL命令调用存储过程。语法如下-
CALL yourStoredProcedureName;
调用上面的存储过程来循环遍历第一个表的所有行。查询如下-
mysql> call Sp_AllRowsOfATable();
调用存储过程之后,让我们检查第二个表发生了什么。查询如下-
mysql> select StudentId from SecondTableRows;
输出结果
+-----------+ | StudentId | +-----------+ | 1 | | 100 | | 300 | | 400 | +-----------+ 4 rows in set (0.00 sec)