【问题标题】:SQL: deleting tables with prefixSQL:删除带前缀的表
【发布时间】:2010-12-08 00:55:26
【问题描述】:

如何删除所有前缀为myprefix_的表?

注意:需要在phpMyAdmin中执行

【问题讨论】:

    标签: mysql phpmyadmin sql-drop


    【解决方案1】:

    您可以在一个命令中使用 MySQL:

    drop table myprefix_1, myprefix_2, myprefix_3;

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

    另一种方法是将general purpose routine library 用于 MySQL 5。

    【讨论】:

      【解决方案2】:

      你不能只用一个 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_%';
      

      【讨论】:

      • 我只有一个数据库,所以我不需要第二个。
      • @ElijahLynn 限制来源可能是由于 GROUP_CONCAT 最大长度。你可以放大它,例如看here
      • 自我注意。增加最大字符数:SET SESSION group_concat_max_len = 999999999;
      • 请注意,在某些情况下,表格前缀名称[...] LIKE 'myprefix\_%';中的下划线需要转义
      • 这会返回大量重复的表名。恕我直言,Pankaj Khurana 发布的答案效果更好。
      【解决方案3】:
      show tables like 'prefix_%';
      

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

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

      drop table myprefix_1, myprefix_2, myprefix_3;
      

      【讨论】:

      • 无法访问我正在使用的虚拟主机上的 information_schema.tables,所以这是要走的路,谢谢!
      【解决方案4】:

      @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 实现,只需稍作改动。

      【讨论】:

      • ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“@tbls”附近使用正确的语法错误 1243 (HY000):未知的准备好的语句处理程序 (stmt) 给执行错误 1243 (HY000):未知的准备好的语句处理程序(stmt) 给 DEALLOCATE PREPARE
      • 语法错误:PREPARE stmt FROM 'DROP TABLE @tbls';
      【解决方案5】:
      SELECT CONCAT("DROP TABLE ", table_name, ";") 
      FROM information_schema.tables
      WHERE table_schema = "DATABASE_NAME" 
      AND table_name LIKE "PREFIX_TABLE_NAME%";
      

      【讨论】:

        【解决方案6】:

        之前的一些答案非常好。 我把他们的想法和一些 来自网络上其他答案的概念。

        我需要删除所有以“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 程序员有用。

        【讨论】:

        • 这完全是正确的答案。其他答案使用多个步骤或要求手动完成。不知道这个答案在 4 年后怎么没有更多的选票!
        • 这是使用 mysql 命令行的人的正确答案。无需复制粘贴,直接切入主题。
        • 好东西,但不适用于带有连字符的表名
        【解决方案7】:

        我发现准备好的语句对我来说有点棘手,但是当你有很多表时,设置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 语句。

        【讨论】:

        • \G 结束查询而不是; 可以提供更清晰的输出
        【解决方案8】:

        我只是想发布我使用的确切 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;
        

        【讨论】:

          【解决方案9】:

          我通过编辑查询成功删除表

          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;
          

          【讨论】:

          • 这是我发现的唯一一个在解决外键约束的同时在一个 shebang 中完成整个操作的人。
          【解决方案10】:

          使用 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;
          

          【讨论】:

            猜你喜欢
            • 2015-05-25
            • 1970-01-01
            • 2019-08-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多