SQL:删除带前缀的表

时间:2009-10-19 15:14:44

标签: mysql phpmyadmin sql-drop

如何删除所有前缀为myprefix_

的表格

注意:需要在phpMyAdmin

中执行它

10 个答案:

答案 0 :(得分:157)

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

答案 1 :(得分:29)

之前的一些答案非常好。 我把他们的想法与一些人结合在一起 来自网络上其他答案的概念。

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

答案 2 :(得分:20)

show tables like 'prefix_%';

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

你会得到这样的东西:

drop table myprefix_1, myprefix_2, myprefix_3;

答案 3 :(得分: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实现,但稍作修改。

答案 4 :(得分:3)

SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";

答案 5 :(得分:3)

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

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;

答案 6 :(得分:2)

你可以用MySQL的一个命令来做到这一点:

drop table myprefix_1, myprefix_2, myprefix_3;

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

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

答案 7 :(得分: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;

答案 8 :(得分: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 语句。

答案 9 :(得分:1)

使用 GROUP_CONCAT 的另一个解决方案,因此它将执行一个drop查询,如
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;