[英]MySql loop through several tables with similar names
我想遍历几个具有相似名称的 mysql 表,例如
table_1_user
table_2_user
table_3_user
总之,我希望迭代器计数最多为 20,以便最终我将对所有 20 个表进行一些查询。 如您所见,唯一的区别是名称中的数字。 所以我做了一些研究,找到了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
但我还不能完全弄清楚。
任何帮助将不胜感激!
提前非常感谢!
所以..几天后我自己想通了。
幸运的是,还有另一个表包含我需要的所有 ID,以便进行我正在寻找的更新。
所以除了
table_1_user
table_2_user
table_3_user
有一张桌子存放着身份证:
表用户
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();
然后我必须添加所需的while 循环,从临时表中选择一个 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以及EXECUTE以触发它。
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();
它对我有用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.