-->

SQL:删除前缀表(SQL: deleting tables with prefix)

2019-08-20 13:10发布

如何删除我的表谁都有一个前缀myprefix_

注:需要在phpMyAdmin执行它

Answer 1:

你不能只是一个单一的MySQL命令做到这一点,但是你可以使用MySQL构建声明为您提供:

在MySQL外壳中或通过phpmyadmin,使用以下查询

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

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

编辑:这里的一个声明 - 上面生成将下降与该前缀的所有数据库中的所有表的语句。 如果你想将其限制在一个特定的数据库,修改查询,看起来像这样并用自己的数据库名称替换数据库名称:

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


Answer 2:

一些早期的答案都非常好。 我有自己的想法拉到一起与网络上的其他答案有些概念。

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



Answer 3:

show tables like 'prefix_%';

查询复制结果并将其粘贴到文本编辑器或输出到文件,使用一些搜索和替换,以除去不需要的格式和替换\n用逗号放; 上月底下降表添加到前面。

你会得到的东西看起来是这样的:

drop table myprefix_1, myprefix_2, myprefix_3;


Answer 4:

@安德烈-米勒的解决方案是好的,但有更好的和稍微更专业,这将帮助你一次过执行所有。 仍然需要一个以上的命令,但该解决方案将允许你使用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略有改动。



Answer 5:

我成功地删除表的编辑查询喜欢这个

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;


Answer 6:

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


Answer 7:

你可以做到这一点与MySQL一个命令:

drop table myprefix_1, myprefix_2, myprefix_3;

你可能不得不在代码中动态创建表名单虽然。

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



Answer 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;


Answer 9:

我发现,所制备的声明是有点棘手的工作对我来说,但设置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语句。



Answer 10:

刚开始使用GROUP_CONCAT另一种解决方案,因此它会执行像一滴查询
DROP TABLE表1,表2,..

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;


文章来源: SQL: deleting tables with prefix