我想遍历几个具有类似名称的mysql表
table_1_user
table_2_user
table_3_user
总而言之,我希望迭代器最多计数20个,以便最终我将对所有20个表进行一些查询。如您所见,唯一的区别是名称中的数字。因此,我进行了一些研究,并发现answer的Martynnw。 我不得不提到的一个缺点是缺少一个或两个ID,因此可能是我们有一个table_3和一个table_5,但table_4可能会丢失。因此,我还想检查一下该表是否存在(如有必要)。
我相信必须可以做这样的事情:
Declare @Id int
While @Id < 20
Begin
UPDATE table_@Id_user SET option_value = 'mychange' WHERE my_id = 123;
End
但是我还不太清楚。
任何帮助将不胜感激!
非常感谢!
答案 0 :(得分:0)
所以..几天后,我自己弄清楚了。
幸运的是,还有一个表包含我需要的所有ID,以便进行我正在寻找的更新。
除了
table_1_user
table_2_user
table_3_user
有一张桌子,上面摆着ID:
TABLE用户
user_id | user_name | ...
1 max
2 justin
... ...
所以第一步,我必须创建一个临时表:
CREATE TEMPORARY TABLE temp
SELECT user_id FROM users;
接下来,我必须创建一个过程才能使用while循环:
DELIMITER $$
DROP PROCEDURE IF EXISTS Update_User_URLS;
CREATE PROCEDURE Update_User_URLS()
BEGIN
...
END $$
DELIMITER ;
CALL Update_User_URLS();
然后,我必须在循环中从临时表中选择一个user_id时添加所需的 。在循环结束时,必须从临时表中删除此user_id:
DELIMITER $$
DROP PROCEDURE IF EXISTS Update_User_URLS;
CREATE PROCEDURE Update_User_URLS()
BEGIN
WHILE (SELECT COUNT(*) FROM temp) > 0 DO
SELECT @id := user_id FROM temp LIMIT 1;
...
DELETE FROM temp WHERE user_id = @id;
END WHILE;
END $$
DELIMITER ;
CALL Update_User_URLS();
在while循环中,我不得不将变量设置为连接表名,并使用 PREPARE 来指定查询以及执行以将其触发。
DELIMITER $$
DROP PROCEDURE IF EXISTS Update_User_URLS;
CREATE PROCEDURE Update_User_URLS()
BEGIN
WHILE (SELECT COUNT(*) FROM temp) > 0 DO
SELECT @id := user_id FROM temp LIMIT 1;
SET @table = concat('table_', @id, '_user');
SET @query = concat('UPDATE ', @table, 'SET user_url = replace(user_url, '"example.com"', '"anotherexample.com"')')
PREPARE statement from @query;
EXECUTE statement;
DELETE FROM temp WHERE user_id = @id;
END WHILE;
END $$
DELIMITER ;
CALL Update_User_URLS();
对我有用!