繁体   English   中英

MySql 循环遍历几个同名的表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM