SQL:删除带有前缀的表

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

注意:需要在phpMyAdmin中执行

你不能只用一个MySQL命令来完成,但是你可以使用MySQL来为你构build语句:

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

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

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

编辑:这里的免责声明 – 上面生成的声明将删除所有数据库中的所有表与该前缀。 如果要将其限制为特定的数据库,请将查询修改为如下所示,并用您自己的database_namereplacedatabase_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_%'; 

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

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

 show tables like 'prefix_%'; 

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

你会得到像这样的东西:

 drop table myprefix_1, myprefix_2, myprefix_3; 

@ andre-miller解决scheme是好的,但有更好,稍微更专业,将帮助你一口气执行所有。 仍然需要多个命令,但是这个解决scheme将允许你使用SQL来自动构build。

 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上实现,只是稍微改变一下。

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

 drop table myprefix_1, myprefix_2, myprefix_3; 

您可能必须在代码中dynamic构build表列表。

另一种方法是使用MySQL 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; 

我只是想发布我使用的确切的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; 

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

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

只是使用GROUP_CONCAT的另一个解决scheme,因此它将执行一个像这样的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;