批量删除超过1小时的表所需的存储过程

时间:2017-05-23 23:18:04

标签: mysql stored-procedures bulk-delete

我创建了以下MySQL(v5.7.14)存储过程。它成功地删除了数据库中所有以前缀为' members_list _'的表格。但是,我只想删除带前缀的表格' members_list _' AND 超过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功能,但是当我'生活'时#39;该段代码(通过删除&#39;; - &#39;部分),我收到以下错误消息:

  

程序执行失败   1064 - 您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便使用“&#39; NULL&#39;在第1行

是否可以批量删除超过1小时的前缀表?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题。 &#39; 1064&#39;的原因错误消息是GROUP_CONCAT字符串长度的默认限制为1024个字符。这意味着因为我有时删除了很多表,所以违反了1024个限制。

为了解决这个问题,我需要将GROUP_CONCAT命令设置为更高的数字,因此:

SET SESSION group_concat_max_len = 1000000;

此后存储过程正常。这是我整个修改过的存储过程。它还包括一个案例&#39;例程,如果满足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;

END