mysql遍历表查询_如何遍历表的所有行?(MySQL)?mysql-问答-阿里云开发者社区-阿里云...

本文介绍了如何在MySQL中遍历表的每一行,通过创建存储过程和使用WHILE循环或者DECLARE游标来处理表数据。示例展示了如何将表A的数据插入到表B中,同时提供了基于集合查询的建议。
摘要由CSDN通过智能技术生成

由于建议使用循环意味着需要过程类型的解决方案。这是我的。

任何对从表中获取的任何记录进行处理的查询都可以包装在一个过程中,以使其遍历表的每一行,如下所示:

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

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; ;; 请记住,声明要使用的变量与查询表中的变量相同。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值