SQL:删除带前缀的表

Den*_*man 91 mysql phpmyadmin sql-drop

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

注意:需要在phpMyAdmin中执行它

And*_*ler 162

您不能只使用一个MySQL命令来执行此操作,但是您可以使用MySQL为您构造语句:

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

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

这将生成一个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_%';
Run Code Online (Sandbox Code Playgroud)

  • 自我注释.增加最大字符数:**SET SESSION group_concat_max_len = 999999999;** (6认同)
  • @ElijahLynn限制源可能是由于GROUP_CONCAT最大长度.你可以放大它,参见[here](http://stackoverflow.com/questions/2567000/mysql-and-group-concat-maximum-length) (4认同)
  • 请注意,在某些情况下,有必要对表前缀名称中的下划线进行转义,例如[...] LIKE'myprefix \ _%';`。 (2认同)

Bra*_*vik 30

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

我需要删除以'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;
Run Code Online (Sandbox Code Playgroud)

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

  • 这正是正确的答案。其他答案使用多个步骤或要求手动完成。不知道这个答案4年后怎么没有更多的票! (2认同)

小智 21

show tables like 'prefix_%';
Run Code Online (Sandbox Code Playgroud)

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

你会得到这样的东西:

drop table myprefix_1, myprefix_2, myprefix_3;
Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 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;
Run Code Online (Sandbox Code Playgroud)

注意:这段代码是依赖于平台的,它是针对MySQL的,但肯定可以为Postgre,Oracle和MS SQL实现稍微改动.

  • 语法错误:PREPARE stmt FROM 'DROP TABLE @tbls'; (2认同)

小智 5

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