我创建了以下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小时的前缀表?
答案 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