如何删除所有具有前缀 myprefix_
的表?
注意:需要在phpMyAdmin中执行。
你无法仅通过一个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语句,你可以复制并执行以删除表格。SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' )
AS statement FROM information_schema.tables
WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
之前的回答中有些非常好。我将它们的想法与一些其他网络回答的观点汇总在一起。
我需要删除所有以“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_%';
将结果复制并粘贴到文本编辑器中,或者将查询输出到文件中,使用一些搜索和替换操作来删除不需要的格式,并用逗号替换\n
。在开头添加drop table
,并在结尾加上;
。
你将得到类似于以下内容:
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%";
我通过编辑查询成功地删除了表格,如下所示:
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查询,例如
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;
drop table myprefix_1, myprefix_2, myprefix_3;
尽管如此,您可能需要在代码中动态构建表列表。
另一种方法是使用MySQL 5的通用例程库。
我只是想发布我使用的确切SQL语句 - 它是前三个答案的混合体:
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_%';
\G
代替;
来结束查询可以得到更干净的输出。 - Stuart Cardall
[...] LIKE 'myprefix\_%';
。 - Magictallguy