【发布时间】:2010-12-08 00:55:26
【问题描述】:
如何删除所有前缀为myprefix_的表?
注意:需要在phpMyAdmin中执行
【问题讨论】:
标签: mysql phpmyadmin sql-drop
如何删除所有前缀为myprefix_的表?
注意:需要在phpMyAdmin中执行
【问题讨论】:
标签: mysql phpmyadmin sql-drop
您可以在一个命令中使用 MySQL:
drop table myprefix_1, myprefix_2, myprefix_3;
您可能必须在代码中动态构建表格列表。
另一种方法是将general purpose routine library 用于 MySQL 5。
【讨论】:
你不能只用一个 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_%';
【讨论】:
[...] LIKE 'myprefix\_%';中的下划线需要转义
show tables like 'prefix_%';
复制结果并将它们粘贴到文本编辑器或将查询输出到文件,使用一些搜索和替换来删除不需要的格式并将\n 替换为逗号
在末尾放一个; 并将放置表添加到前面。
你会得到如下所示的东西:
drop table myprefix_1, myprefix_2, myprefix_3;
【讨论】:
@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 实现,只需稍作改动。
【讨论】:
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
【讨论】:
之前的一些答案非常好。 我把他们的想法和一些 来自网络上其他答案的概念。
我需要删除所有以“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 程序员有用。
【讨论】:
我发现准备好的语句对我来说有点棘手,但是当你有很多表时,设置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 结束查询而不是; 可以提供更清晰的输出
我只是想发布我使用的确切 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;
【讨论】:
我通过编辑查询成功删除表
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;
【讨论】:
使用 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;
【讨论】: