删除以特定前缀开头的所有表格?

时间:2014-06-04 18:42:37

标签: mysql sql

我在这个问题上找到了另一个帖子,但是我无法使用它的解决方案,所以我想我会更清楚和详细地询问。

我有一个代表vBulletin论坛的大型MySQL数据库。多年来,这个论坛在每个视图上都生成了一个错误,每次都创建一个名为aagregate_temp_1251634200aagregate_temp_1251734400等的新表。数据库中有大约20,000个这样的表,而我希望全部删除它们。

我想发出一个相当于DROP TABLE WHERE TABLE_NAME LIKE 'aggregate_temp%';

的命令

不幸的是,这个命令不起作用,谷歌对这个问题的结果充满了我所理解的精心设计的存储过程,并且看起来都是针对不同海报的更复杂问题而定制的。

是否可以编写一个基于name like匹配丢弃多个表的简单语句?

4 个答案:

答案 0 :(得分:6)

没有一个声明可以做到这一点。

最简单的方法是生成一组语句,并单独执行它们。

简单查询可以为您生成语句:

 SELECT CONCAT('DROP TABLE `',t.table_schema,'`.`',t.table_name,'`;') AS stmt
   FROM information_schema.tables t
  WHERE t.table_schema = 'mydatabase'
    AND t.table_name LIKE 'aggregate\_temp%' ESCAPE '\\'
  ORDER BY t.table_name

它只返回一个行集,但这些行方便地包含您需要执行的确切SQL语句。 (请注意,information_schema是一个包含元数据的内置数据库。您只需要将 mydatabase 替换为要从中删除表的数据库的名称。

将此查询的结果集保存为纯文本文件,删除任何标题行,瞧,您可以在SQL客户端中执行脚本。

不需要精心设计的存储过程。

答案 1 :(得分:4)

一个小小的谷歌搜索发现了这个:

SELECT 'DROP TABLE "' + TABLE_NAME + '"' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

这应该生成一个脚本。

来源Drop all tables whose names begin with a certain string

答案 2 :(得分:4)

从内存中你必须使用预准备语句,例如:堆栈交换上的大量样本

我会推荐这个例子:

SQL: deleting tables with prefix

上面的SQL,这个包含特定的数据库名称 - 它为你构建它

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
AS statement FROM information_schema.tables 
WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';

这是另一种方法:

MySQL bulk drop table where table like?

答案 3 :(得分:2)

这将删除前缀为“mg_”

的所有表格

无需复制和粘贴行集,并且在phpadmin中复制和粘贴是有问题的,因为它会切断长表名称并将其替换为“...”破坏sql命令集。

另请注意,'_'是一个特殊字符,因此'mg_'应编码为'mg \ _'

(并且需要禁用FOREIGN_KEY_CHECKS以避免错误消息)

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables
  FROM information_schema.tables
  WHERE table_schema = (SELECT DATABASE()) and table_name like 'mg\_%';
SELECT IFNULL(@tables,'dummy') INTO @tables;

SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;