SQL:删除带前缀的表


Answers:


178

您不能仅使用单个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_%';

我只有一个数据库,所以我不需要第二个数据库。
Deniz Zoeteman

4
@ElijahLynn限制源可能是由于GROUP_CONCAT最大长度所致。您可以扩大它,请参阅此处
Asaf David

7
自我注意。增加最大字符数:SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid 2015年

2
请注意,在某些情况下,有必要对表前缀名称中的下划线进行转义[...] LIKE 'myprefix\_%';
Magictallguy

1
这将返回许多重复的table_names。Pankaj Khurana发布的答案效果更好,恕我直言。
杰里米(Jeremy)'18年

37

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

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


1
这是正确的答案。其他答案使用多个步骤或要求手动完成。不知道四年后这个答案没有更多的票!
gbe

25
show tables like 'prefix_%';

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

您将获得如下所示的内容:

drop table myprefix_1, myprefix_2, myprefix_3;

1
不能访问我正在使用的Webhost上的information_schema.tables,所以这是要感谢的方法!
弗洛伦特·罗克斯

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。


错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的'@tbls'附近使用正确的语法错误1243(HY000):给予执行错误的未知预备语句处理程序(stmt)错误1243(HY000):未知预备语句处理程序(stmt)提供给DEALLOCATE PREPARE
Roni Tovi

语法错误位于:从'DROP TABLE @tbls'制备stmt;
ledawg '16


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;

这是我发现的唯一一个在解决外键约束时一次完成整个操作的操作。
埃文·马特森

2

您可以使用MySQL在一个命令中做到这一点:

drop table myprefix_1, myprefix_2, myprefix_3;

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

一种替代方法是对MySQL 5 使用通用例程库


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;

2

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

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语句。


以结束查询,\G而不是;给出更清晰的输出
Stuart Cardall'Dec 31'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.