我在这个问题上找到了另一个帖子,但是我无法使用它的解决方案,所以我想我会更清楚和详细地询问。
我有一个代表vBulletin论坛的大型MySQL数据库。多年来,这个论坛在每个视图上都生成了一个错误,每次都创建一个名为aagregate_temp_1251634200
,aagregate_temp_1251734400
等的新表。数据库中有大约20,000个这样的表,而我希望全部删除它们。
我想发出一个相当于DROP TABLE WHERE TABLE_NAME LIKE 'aggregate_temp%';
。
不幸的是,这个命令不起作用,谷歌对这个问题的结果充满了我所理解的精心设计的存储过程,并且看起来都是针对不同海报的更复杂问题而定制的。
是否可以编写一个基于name like
匹配丢弃多个表的简单语句?
答案 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]%'
这应该生成一个脚本。
答案 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_%';
这是另一种方法:
答案 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;