我在这个问题上找到了另一个帖子,但是我无法使用它的解决方案,所以我想我会更清楚和详细地询问.
我有一个代表vBulletin论坛的大型MySQL数据库.几年来,这个论坛已经对每个视图生成一个错误,每次创建一个名为新表aagregate_temp_1251634200,aagregate_temp_1251734400等等等,有在数据库中这些表的约20,000,我想将它们全部删除.
我想发出一个相当于的命令DROP TABLE WHERE TABLE_NAME LIKE 'aggregate_temp%';.
不幸的是,这个命令不起作用,谷歌对这个问题的结果充满了我所理解的精心设计的存储过程,而且所有这些程序似乎都适合不同海报的更复杂的问题.
是否可以编写一个基于name like匹配丢弃多个表的简单语句?
没有一个声明可以做到这一点.
最简单的方法是生成一组语句,并单独执行它们.
一个简单的查询可以为您生成语句:
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
Run Code Online (Sandbox Code Playgroud)
这只返回一个行集,但行方便地包含您需要执行的确切SQL语句.(请注意,这information_schema是一个包含元数据的内置数据库.您只需要替换mydatabase要从中删除表的数据库的名称.
保存此查询结果集为纯文本文件,删除任何标题行,瞧,你已经有了一个脚本,你可以在你的SQL客户端执行.
不需要精心设计的存储过程.
稍微谷歌搜索发现了这个:
SELECT 'DROP TABLE "' + TABLE_NAME + '"'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'prefix%'
Run Code Online (Sandbox Code Playgroud)
这应该生成一个脚本。
根据记忆,您必须使用准备好的语句,例如:堆栈交换上的大量示例
我会推荐这个例子:
上面的 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_%';
Run Code Online (Sandbox Code Playgroud)
这是一种不同的方法: