我怎样才能循环表中的所有行? (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 }