如何删除所有都有前缀的表myprefix_
?
注意:需要在phpMyAdmin中执行
如何删除所有都有前缀的表myprefix_
?
注意:需要在phpMyAdmin中执行
Answers:
您不能仅使用单个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\_%';
较早的一些答案是非常好的。我将他们的想法与网络上其他答案中的一些想法结合在一起。
我需要删除所有以'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程序员有用。
@ 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;
我只想发布我使用的确切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的另一种解决方案,因此它将执行一个拖放查询,例如
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;
我发现准备好的语句对我来说有点棘手,但是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
而不是;
给出更清晰的输出