Хранимая процедура, необходимая для массового удаления таблиц, которые старше 1 часа

Я создал следующую хранимую процедуру MySQL (v5.7.14). Он успешно удаляет все таблицы в моей базе данных с префиксом members_list_. Тем не менее, я хотел бы только удалить таблицы с префиксом 'members_list_' и старше 1 часа.

BEGIN
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables 
FROM information_schema.tables 
WHERE table_schema = 'my_database_name' 
AND table_name LIKE 'members_list_%'; -- AND CREATE_TIME < (NOW() - INTERVAL 1 HOUR);

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END

Вы увидите, что я выдал команду в предложении WHERE. Он использует функцию CREATE_TIME, но когда я "оживляю" этот сегмент кода (удаляя часть "; -"), я получаю следующее сообщение об ошибке:

Ошибка выполнения процедуры 1064 - В вашем синтаксисе SQL есть ошибка; проверьте руководство, которое соответствует> вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'NULL' в строке 1

Возможно ли вообще массовое удаление таблиц с префиксом, которые старше 1 часа?

1 ответ

Чтобы ответить на мой собственный вопрос. Причиной появления сообщения об ошибке "1064" было то, что длина строки GROUP_CONCAT имеет ограничение по умолчанию в 1024 символа. Это означало, что из-за того, что я иногда удалял много таблиц, этот предел 1024 был нарушен.

Чтобы исправить это, мне нужно было установить для команды GROUP_CONCAT намного большее число, таким образом:

SET SESSION group_concat_max_len = 1000000;

Хранимая процедура работала нормально после этого. Вот моя вся пересмотренная хранимая процедура. Он также включает в себя подпрограмму "CASE", которая гарантирует, что она не потерпит неудачу, если выполнено условие NULL.

BEGIN
SET SESSION group_concat_max_len = 1000000;

SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables FROM information_schema.tables 
    WHERE table_schema = 'indexingwebsite2017' AND table_name LIKE 'ma_members_list_%' AND CREATE_TIME < (NOW() - INTERVAL 1 HOUR);

CASE 
    WHEN ISNULL(@tables) THEN 
        SELECT 'NULL VALUE DETECTED' AS Verification;
    ELSE 
        SET @tables = CONCAT('DROP TABLE ', @tables);
        select @tables;
        PREPARE stmt1 FROM @tables;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1; 
END CASE;

КОНЕЦ

Другие вопросы по тегам