34
DROP TABLE (
SELECT table_name
FROM information_schema.`TABLES`
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%');

我知道这行不通!在 SQL 中,类似这样的东西的等价物是什么?我可以编写一个简单的 Python 脚本来执行此操作,但只是想知道我们是否可以直接使用 SQL 做一些事情。我正在使用 MySQL。谢谢!

4

6 回答 6

65

您可以使用准备好的语句-

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;
于 2012-06-15T14:59:25.817 回答
21

@Devart 的答案的一个小改进:

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

这些变化是:

  1. 反引号 (`) 包装表名(如果它包含非标准字符)
  2. 添加了一个LIMIT以避免我评论过的截断问题
  3. 添加了一个“打印”(select @tables;)以在停止执行脚本时进行某种控制
于 2013-08-18T14:12:24.523 回答
14

如果你只需要快速删除一堆表(不是纯 SQL,所以不直接回答这个问题),一个 shell 命令可以做到:

echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
于 2013-02-02T01:22:45.127 回答
2

我发现将 IFNULL 添加到 Devart 的解决方案中很有用,以避免在没有与查询匹配的表时生成错误。

SET @tables = IFNULL(CONCAT('DROP TABLE ', @tables),'SELECT NULL;');
于 2015-07-01T19:07:22.447 回答
1

除了@Devart 的回答:

如果你有很多表,你可能需要设置group_concat_max_len

SET group_concat_max_len = 4096;
于 2021-04-23T08:55:31.163 回答
-1

如果您有可用的 phpMyAdmin 并且要求删除具有特定前缀的表,则可以快速轻松地完成此操作。转到您想要的数据库,并显示所有表的列表。由于表格是按字母顺序显示的,因此带有删除前缀的表格都会一起出现。转到第一个,然后单击左侧的复选框。然后向下滚动到带有前缀的最后一个表格,按住 shift 并单击复选框。这会导致所有带有前缀的表格都被勾选。转到列表的底部,然后为所有选定的表选择操作下拉。完成删除,检查生成的 SQL 是否正确!

于 2019-03-23T09:41:03.207 回答