DROP TABLE (
SELECT table_name
FROM information_schema.`TABLES`
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%');
我知道这不起作用! SQL中这样的东西有什么用呢?我可以用一个简单的Python脚本来做这个,但只是想知道我们是否可以直接用SQL做一些事情。我正在使用MySQL。谢谢!
答案 0 :(得分:44)
您可以使用prepared statements -
SET @tables = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name,'`') INTO @tables FROM information_schema.tables
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%';
SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
它将生成并执行这样的语句 -
DROP TABLE myDatabase.del1, myDatabase.del2, myDatabase.del3;
答案 1 :(得分:14)
对@Devart's answer的一个小改进:
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.`', table_name, '`') INTO @tables FROM
(select * from
information_schema.tables
WHERE table_schema = 'myDatabase' AND table_name LIKE 'del%'
LIMIT 10) TT;
SET @tables = CONCAT('DROP TABLE ', @tables);
select @tables;
PREPARE stmt1 FROM @tables;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
此脚本应重复执行,直到控制台的输出为NULL
变化是:
LIMIT
以避免我评论的截断问题select @tables;
)以便在何时停止执行脚本时进行某种控制答案 2 :(得分:10)
如果你只需要快速删除一堆表(不是在纯SQL中,所以不直接回答这个问题),一行shell命令可以做到这一点:
echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
答案 3 :(得分:1)
我发现将IFNULL添加到Devart的解决方案很有用,以避免在没有与查询匹配的表时生成错误。
SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');
答案 4 :(得分:0)
除了@Devart 的回答:
如果你有很多表,你可能需要设置group_concat_max_len
:
SET group_concat_max_len = 4096;
答案 5 :(得分:-1)
如果可以使用phpMyAdmin并且要求删除具有特定前缀的表,则可以快速轻松地执行此操作。转到所需的数据库,并显示所有表的列表。由于表格以字母顺序显示,因此带有删除前缀的表格将一起出现。转到第一个,然后单击左侧的复选框。然后向下滚动到带有前缀的最后一个表,按住shift键,然后单击复选框。这将导致所有带有前缀的表被打勾。转到列表的底部,然后为所有选定的表选择操作下拉菜单。完成删除操作,检查生成的SQL看起来正确!