MySQL:如何使用单个查询删除多个表?

17

我希望能够轻松地删除多个表,而不必在删除查询中列出表名。要删除的表具有前缀,比如说 'wp_'。


类似问题 - https://dev59.com/kVTTa4cB1Zd3GeqPqDTn#5430104 - Devart
8个回答

17

我使用了与Angelin非常相似的查询语句。如果你有多个表格,就必须增加group_concat的最大长度。否则,查询语句将无法处理由group_concat返回的截断字符串。

这是我的看法:

-- Increase memory to avoid truncating string, adjust according to your needs
SET group_concat_max_len = 1024 * 1024 * 10;
-- Generate drop command and assign to variable
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';') INTO @dropcmd FROM information_schema.tables WHERE table_schema='databasename' AND table_name LIKE 'my_table%';
-- Drop tables
PREPARE str FROM @dropcmd; EXECUTE str; DEALLOCATE PREPARE str;

谢谢您,如果不增加group_concat_max_len的值,Angelin的答案永远不会适用于我的情况。 - Warren Sergent

9

分享其中一种解决方案:

mysql> SELECT CONCAT( "DROP TABLE ",
GROUP_CONCAT(TABLE_NAME) ) AS stmt

FROM information_schema.TABLES

WHERE TABLE_SCHEMA = "你的数据库名" AND TABLE_NAME LIKE "你的条件" into outfile '/tmp/a.txt';

mysql> source /tmp/a.txt;

注意:请自行替换“你的数据库名”和“你的条件”。

4

简单而不会出错的解决方案:

mysqldump 创建一个包含 DROP 命令的文件,如下所示:

DROP TABLE IF EXISTS `wp_matable`;

使用带有“DROP TABLE wp_”的“grep”命令可以给我们执行命令的指令。

因此,这三行代码执行了删除操作(您可以编辑drop.sql以查看在此之前将删除哪些表)。

mysqldump -u user -p database > dump.sql 
grep "DROP TABLE `wp_" dump.sql > drop.sql
mysql -u user -p database < drop.sql

我不确定你的答案是否有错误,但为了使grep命令工作,我必须写成DROP TABLE IF EXISTS而不是只写DROP TABLE,并且我必须用“\”字符转义反引号。例如:grep "DROP TABLE IF EXISTS \\table_prefix_" dump.sql > drop.sql。 我只是用sudo mysqldump > dump.sql简单地导出,然后通过Unix套接字以root身份登录sudo mysql,在选择数据库use db_name之前执行SQL文件. drop.sql`。 - baptx

2

在Mysql中,需要在“_”前加上“\”进行转义,以避免出现错误。

SELECT CONCAT('DROP TABLE',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';') INTO @dropcmd FROM information_schema.tables WHERE table_schema='databasename' AND table_name LIKE '**my\\_table**%';

2

当需要删除大量表格时,有一种不那么复杂的解决方案 -

SELECT GROUP_CONCAT(table_name SEPARATOR ", ")
    -> AS tables
    -> FROM information_schema.tables
    -> WHERE table_schema = "my_database_name"
    -> AND table_name LIKE "wp_%";
+-------------------------------------------------------------------------
| tables              
+-------------------------------------------------------------------------
| wp_t1, wp_t2, wp_t3, wp_t4, wp_t5, wp_t6, wp_t7, wp_t7, wp_ .......... 
+-------------------------------------------------------------------------

复制表名。然后使用 -

DROP TABLE 
    -> wp_t1, wp_t2, wp_t3, wp_t4, wp_t5, wp_t6, wp_t7, wp_t7, wp_ ..........;

0

对于伟大的mysqldump解决方案,最好使用选项--skip-quote-names

mysqldump --skip-quote-names -u user -p database > dump.sql 
grep "DROP TABLE wp_" dump.sql > drop.sql
mysql -u user -p database < drop.sql

您可以在表名中去掉反引号。如果使用反引号,grep 部分可能在某些环境中无法正常工作。


如果您使用字符“\”进行转义,就可以让反引号在grep中正常工作:https://dev59.com/52w15IYBdhLWcg3wMpAY#cW0qoYgBc1ULPQZFkYWj - baptx

-3

前往 c:\xampp\mysql\data\你的文件夹

选择要删除的多个表,然后按删除按钮

谢谢


2
这个假设是原帖作者正在使用XAMPP并已将其安装到该目录下。 - Jeremy Harris

-4

在MySQL中删除单个表:

DROP TABLE 表名;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接