我怎样才能循环表中的所有行? (MySQL的)

我有一个表A,有一个主键ID。

现在我想通过A中的所有行

我发现类似于“A中的每个logging”,但是这似乎不是你在MySQL中如何做的。

事情是为每一行我想要一个领域和转换,插入到另一个表,然后更新一些行的领域。 我可以把select部分和插入语句放在一个语句中,但是我不知道如何在那里获取更新。 所以我想循环。 而对于练习,我不想使用任何比MySQL更多的东西。

编辑

我会很感激一个例子。

而且这个解决scheme不需要放入程序。

编辑2

好吧,想想这种情况:

表A和B,每个都有字段ID和VAL。

现在这是我想要做的伪代码:

for(each row in A as rowA) { insert into B(ID, VAL) values(rowA[ID], rowA[VAL]); } 

基本上使用循环将A的内容复制到B中。

(这只是一个简单的例子,当然你不会使用循环。)}

由于循环的build议意味着对过程types解决scheme的请求。 这是我的。

任何对从表中取出的单个logging都有效的查询可以被包装在一个过程中,以使其遍历表的每一行,如下所示:

 DROP PROCEDURE IF EXISTS ROWPERROW; DELIMITER ;; 

然后按照你的例子,这里是过程(table_A和table_B用于清晰)

 CREATE PROCEDURE ROWPERROW() BEGIN DECLARE n INT DEFAULT 0; DECLARE i INT DEFAULT 0; SELECT COUNT(*) FROM table_A INTO n; SET i=0; WHILE i<n DO INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A LIMIT i,1; SET i = i + 1; END WHILE; End; ;; 

然后不要忘记重置分隔符

 DELIMITER ; 

并运行新的程序

 CALL ROWPERROW(); 

你可以在“INSERT INTO”这一行中做任何你喜欢的事情,我只是从示例请求中复制而来。

请注意,这里使用的“INSERT INTO”行反映了问题中的行。 根据对这个答案的评论,你需要确保你的查询在语法上正确的运行着哪个版本的SQL。

在简单情况下,您的ID字段递增并从1开始,示例中的行可能变为:

 INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i; 

用“replace”“SELECT COUNT”行

 SET n=10; 

将允许您仅在table_A的前10条logging上testing您的查询。

最后一件事。 这个过程也很容易嵌套在不同的表中,并且是我可以在一个表上dynamic地插入不同数量的logging到父表的每一行的新表中的唯一方法。

如果你需要它运行得更快,那么一定要尝试使它基于设置,如果不是,那么这是好的。 你也可以用光标forms重写上面的内容,但是它可能不会提高性能。 例如:

 DROP PROCEDURE IF EXISTS cursor_ROWPERROW; DELIMITER ;; CREATE PROCEDURE cursor_ROWPERROW() BEGIN DECLARE cursor_ID INT; DECLARE cursor_VAL VARCHAR; DECLARE done INT DEFAULT FALSE; DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_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 table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL); END LOOP; CLOSE cursor_i; END; ;; 

请记住声明您将使用的variables与查询表中的variablestypes相同。

我的build议是在你可以的时候使用基于set的查询,如果你必须使用简单的循环或者光标。

你应该真的使用一个基于集合的解决scheme,涉及两个查询(基本插入):

 INSERT INTO TableB (Id2Column, Column33, Column44) SELECT id, column1, column2 FROM TableA UPDATE TableA SET column1 = column2 * column3 

而为了你的转变:

 INSERT INTO TableB (Id2Column, Column33, Column44) SELECT id, column1 * column4 * 100, (column2 / column12) FROM TableA UPDATE TableA SET column1 = column2 * column3 

现在,如果你的变换比这个更复杂,涉及多个表格,那么请提供另一个问题的细节。

CURSORS在这里是一个选项,但是通常不会使用查询引擎。 考虑调查“基于SET的查询”,看看你是否可以在不使用CURSOR的情况下实现你想要做的事情。

  Use this: $stmt = $user->runQuery("SELECT * FROM tbl WHERE ID=:id"); $stmt->bindparam(":id",$id); $stmt->execute(); $stmt->bindColumn("a_b",$xx); $stmt->bindColumn("c_d",$yy); while($rows = $stmt->fetch(PDO::FETCH_BOUND)) { //---insert into new tble }