2009-10-19 81 views

回答

134

你不能只是一个单一的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_%'; 
+0

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

+0

谢谢!所以问题在于我的MySQL服务器太慢了。需要10-15分钟来执行脚本。然后,显示完整的脚本花了太长时间,我停止了它。有更多时间后再试。 –

+0

忽略外键检查怎么样? – Raptor

3

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

drop table myprefix_1, myprefix_2, myprefix_3;

你很有可能要在代码中动态创建表名单虽然。

另一种方法是使用general purpose routine library为MySQL 5

17
show tables like 'prefix_%'; 

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

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

drop table myprefix_1, myprefix_2, myprefix_3; 
+0

无法访问我正在使用的虚拟主机上的information_schema.tables,所以这是要走的路! – Florent

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略有改动。

+0

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

+0

语法错误在:PREPARE stmt FROM'DROP TABLE @tbls'; –

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

一些较早的答案是非常好的。 我把他们的想法与网络上其他答案的 概念放在一起。

我需要删除以“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

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

+0

以'\ G'结束查询而不是';'给出了一点清理输出 –

1

我只是想后我使用的确切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; 
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; 
+0

这是我发现的唯一一个在处理外键约束时在一个shebang中完成整个操作的程序。 –

0

只是另一种解决方案,使用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;