如何循环遍历表的所有行?(MySQL)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (153)

我有一张A桌,有一个主键ID。

现在,我要检查A中的所有行。

问题是,对于每一行,我想要获取一个字段并转换它,将其插入到另一个表中,然后更新该行的一些字段。我可以将SELECT部分和INSERT放在一个语句中,但是我也不知道如何在其中获得更新。所以我想循环一下。为了练习,我不想使用MySQL以外的任何东西。

我想举个例子。

和一种不需要进入程序的解决方案。

好吧,想象一下这个场景:

表A和表B各有ID和Val字段。

下面是我要做的伪代码:

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

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

(这只是一个简化的例子,当然您不会为此使用循环。)}

提问于
用户回答回答于

因为循环的建议意味着对过程类型的解决方案的请求。这是我的。

对从表中提取的任何单个记录起作用的任何查询都可以包装在一个过程中,以便使其在表的每一行中运行,如下所示:

DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;

下面是根据示例(表)的步骤_A和桌子_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();

可以在“插入到”行中任意操作,我只是从示例请求中复制了该行。

请注意,此处使用的“插入”行反映了问题中的行。根据对这个答案的注释,需要确保你的查询在语法上是正确的,对于正在运行的SQL版本。

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

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

将“选择计数”行替换为

SET n=10;

将允许您在表中的前10条记录上测试查询。_a只有。

最后一件事。这个过程也非常容易在不同的表之间嵌套,并且是我在一个表上执行一个过程的唯一方法,它动态地从父表的每一行将不同数量的记录插入到一个新表中。

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

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;
;;

请记住声明将使用的变量与查询表中的变量的类型相同。

我的建议是,在可能的情况下,使用基于集合的查询,并且只有在必要时才使用简单的循环或游标。

用户回答回答于

确实应该使用基于集合的解决方案,其中涉及两个查询(基本插入):

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

现在,如果你的转换比这个更复杂,并且涉及多个表,那么就发布另一个包含详细信息的问题。

扫码关注云+社区