113

如何删除所有具有前缀的表myprefix_

注意:需要在phpMyAdmin中执行

4

10 回答 10

192

你不能只用一个 MySQL 命令来完成它,但是你可以使用 MySQL 为你构造语句:

在 MySQL shell 中或通过 PHPMyAdmin,使用以下查询

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

这将生成一个 DROP 语句,您可以复制并执行该语句来删除表。

编辑:这里的免责声明 - 上面生成的语句将删除所有具有该前缀的数据库中的所有表。如果要将其限制为特定数据库,请将查询修改为如下所示并将 database_name 替换为您自己的 database_name:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
于 2009-10-19T15:20:36.627 回答
41

早期的一些答案非常好。我将他们的想法与网络上其他答案的一些概念结合在一起。

我需要删除所有以“temp_”开头的表经过几次迭代后,我想出了这段代码:

-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = 'my_database'
                AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我希望这对其他 MySQL/PHP 程序员有用。

于 2013-06-26T21:29:24.887 回答
26
show tables like 'prefix_%';

复制结果并将它们粘贴到文本编辑器中或将查询输出到文件中,使用一些搜索和替换来删除不需要的格式,并\n用逗号替换,将 a;放在末尾并将放置表添加到前面。

你会得到如下所示的东西:

drop table myprefix_1, myprefix_2, myprefix_3;
于 2011-11-15T18:17:53.633 回答
10

@andre-miller解决方案很好,但有更好、更专业的解决方案可以帮助您一次性执行所有操作。仍然需要多个命令,但此解决方案将允许您使用 SQL 进行自动构建。

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES
    WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;

注意:此代码依赖于平台,它适用于 MySQL,但可以肯定的是,它可以为 Postgre、Oracle 和 MS SQL 实现,只需稍作改动。

于 2012-09-22T19:22:33.670 回答
6
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
于 2013-05-31T11:45:10.697 回答
4

我通过编辑查询成功删除了表,如下所示

SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
           FROM information_schema.TABLES
          WHERE TABLE_SCHEMA = 'pandora'
            AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
于 2014-07-10T05:05:41.950 回答
3

只是使用GROUP_CONCAT的另一种解决方案,因此它将执行一个删除查询,例如
DROP TABLE table1,table2,..

SET @Drop_Stm = CONCAT('DROP TABLE ', (
      SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
      WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm;
DEALLOCATE PREPARE Stm;
于 2017-11-09T07:29:45.857 回答
2

您可以使用 MySQL 在一个命令中执行此操作:

drop table myprefix_1, myprefix_2, myprefix_3;

不过,您可能必须在代码中动态构建表格列表。

另一种方法是使用 MySQL 5 的通用例程库

于 2009-10-19T15:17:44.993 回答
2

我只是想发布我使用的确切 SQL - 它是前 3 个答案的混合:

SET GROUP_CONCAT_MAX_LEN=10000;

SET @del = (
    SELECT      CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
    FROM        information_schema.TABLES

    WHERE       TABLE_SCHEMA = 'database_name'
    AND         TABLE_NAME LIKE 'prefix_%'
);

PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-11-28T03:57:11.583 回答
1

我发现准备好的语句对我来说有点棘手,但是GROUP_CONCAT_MAX_LEN当你有很多表时设置它是必不可少的。这导致了一个简单的三步过程,从mysql命令行进行剪切和粘贴,这对我来说非常有用:

SET GROUP_CONCAT_MAX_LEN=10000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

然后小心地剪切和粘贴生成的长DROP语句。

于 2013-10-19T16:03:51.280 回答