MySql перебирает несколько таблиц с похожими именами - PullRequest
0 голосов
/ 30 октября 2019

Я хочу просмотреть несколько таблиц mysql с похожими именами, такими как

table_1_user

table_2_user

table_3_user

В сумме я хочу количество итераторовдо 20, так что в конце я запустил несколько запросов по всем 20 таблицам. Как видите, единственная разница - это число внутри имени. Поэтому я провел небольшое исследование и нашел этот ответ Martynnw . Единственный недостаток, о котором я должен упомянуть, это отсутствие одного или двух идентификаторов, поэтому может быть, что у нас есть 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

Но япока не могу понять это.

Любая помощь будет принята с благодарностью!

Заранее большое спасибо!

1 Ответ

0 голосов
/ 02 ноября 2019

Итак ... пару дней спустя я сам все понял.

К счастью, была еще одна таблица, содержащая все идентификаторы, которые мне были нужны для обновления, которое я искал.

Таким образом, в дополнение к

table_1_user
table_2_user
table_3_user

была таблица, содержащая идентификаторы:

TABLE пользователей

user_id | user_name | ...
1         max
2         justin
...       ...

Итак, на первом шаге я должен был создать временную таблицу 1016 *:

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 для моего назначенного запроса, а также 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();

И у меня это сработало!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...