MySQL批量删除表在哪里表?

Thi*_*ode 24 mysql sql-drop

DROP TABLE (
SELECT table_name
FROM information_schema.`TABLES`
WHERE table_schema = 'myDatabase' AND table_name LIKE BINARY 'del%');
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用!SQL中这样的东西有什么用呢?我可以用一个简单的Python脚本来做这个,但只是想知道我们是否可以直接用SQL做一些事情.我正在使用MySQL.谢谢!

Dev*_*art 47

你可以使用准备好的陈述 -

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;
Run Code Online (Sandbox Code Playgroud)

它将生成并执行这样的语句 -

DROP TABLE myDatabase.del1, myDatabase.del2, myDatabase.del3;
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!值得一提的是`GROUP_CONCAT`如果超过其默认值(1024,在当前版本中)将截断其输出,因此在执行此脚本期间可能会出错.请参阅此处的参考资料:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat (5认同)

Ron*_*ein 14

@ 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;
Run Code Online (Sandbox Code Playgroud)

应该重复执行此脚本,直到控制台的输出为止 NULL

变化是:

  1. 用于包装表名的反引号(`)(如果它包含非标准字符)
  2. 添加了一个LIMIT以避免我评论的截断问题
  3. 添加了一个"print"(select @tables;)来控制何时停止执行脚本

  • 我收到错误。ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的“NULL”附近使用的正确语法 (3认同)

Raf*_*ver 11

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

echo "show tables like 'fsm%'" | mysql | tail +2 | while read t; do echo "drop table \`$t\`;"; done | mysql
Run Code Online (Sandbox Code Playgroud)

  • `tail + 2`在Ubuntu上对我不起作用,它必须是`tail -n + 2` (3认同)
  • 请停止使用`tail`,改为使用`mysql -N`. (2认同)