当前位置: 首页 > 面试题库 >

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

东门俊智
2023-03-14
问题内容

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

现在我要遍历A中的所有行。

我发现类似“针对A中的每个记录”的内容,但这似乎并不是您在MySQL中的处理方式。

我想为每一行获取一个字段并对其进行转换,将其插入到另一个表中,然后更新该行的某些字段。我可以将select部分和insert放入一个语句中,但是我也不知道如何在其中进行更新。所以我想循环。实际上,我不想使用MySQL以外的任何东西。

编辑

我将不胜感激。

并且不需要将其放入程序中的解决方案。

编辑2

好吧,请考虑这种情况:

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

然后是您示例中的过程(为清楚起见,使用了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) SELECT (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;

将“ SELECT COUNT”行替换为

SET n=10;

仅让您在table_A的前10条记录中测试查询。

最后一件事。此过程也非常容易嵌套在不同的表中,这是我可以对一个表执行一个过程的唯一方法,该过程可以将父表的每一行中不同数量的记录动态插入到新表中。

如果您需要它运行得更快,请确保尝试将其设置为基础,如果不是,那很好。您也可以用游标形式重写上面的内容,但这可能不会提高性能。例如:

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

请记住,声明要使用的变量与查询表中的变量相同。

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



 类似资料:
  • 问题内容: 我们有一个软件不会删除不再需要的条目。为了了解服务器中有多少数据正在浪费,并准备进行大型清理操作,我试图遍历所有表并拉出标记为删除的记录。这就是我正在使用的: 这是我的错误: 消息116,级别16,状态1,行19当未将EXISTS引入子查询时,只能在选择列表中指定一个表达式。 我意识到我的错误可能与选择该行中的两列有关 但是,我不确定如何才能确保选择下一行。 PS仅用于脚本测试。 如何

  • 问题内容: 我正在运行以下代码,从具有特定列的所有表中提取所有相关的行。外层应该检查该迭代表中是否存在该列。如果没有,它应该完成该迭代并移至下一张表。如果表中有该列,则应检查该表是否将返回任何记录。如果没有要返回的记录,则应结束该迭代并移至下一个表。如果有记录,则应在SSMS中显示它们。 这似乎可行,因为SSMS仅返回带有有效条目的网格。我不明白的是:为什么我仍然会收到这些错误? 编辑 使用建议后

  • 问题内容: 这是我的代码: 这是我此页面的XML: 问题是我只能在LogCat控制台上得到它: 为什么我没有得到对TextViews的引用? 问题答案: 您需要递归遍历视图树。当前,您仅列出根视图的子级。 换句话说,您需要这样的东西:

  • 问题内容: 有没有一种方法可以获取Go语言映射中所有键的列表?元素的数量由给出,但是如果我有类似的地图: 如何遍历所有键? 问题答案: https://play.golang.org/p/JGZ7mN0-U- 要么 语句的Go语言规范指定第一个值是键,第二个变量是值,但不必存在。

  • 问题内容: 我有一个带有多个子SKSpriteNode的SKNode。一个简化的例子: 我想对所有这些孩子采取行动。当我在上执行操作时,没有任何效果。 我不能在父项上使用,因为它的许多子项已经具有我正在使用的名称。 有没有一种方法可以遍历的所有子项,以便对所有子项执行单个操作? 问题答案: 您可以简单地列举: 如有必要,请检查每个孩子是否确实是: 从 Swift 2(Xcode 7)开始, 可以将

  • 问题内容: 我需要JavaScript代码来遍历HTML元素中的填充属性。 这个ref表示我可以通过索引访问它,但是没有指定它是否受良好支持并且可以使用(跨浏览器)。 还是其他方式?(不使用任何框架,例如jQuery / Prototype) 问题答案: 这将在IE,Firefox和Chrome中运行(有人可以测试其他人吗?—谢谢@Bryan): 编辑:IE迭代有问题的DOM对象支持的 所有 属性