【问题标题】:DROP all table with a specific name prefix删除具有特定名称前缀的所有表
【发布时间】:2020-06-10 01:11:31
【问题描述】:

我有一个存储旧安装 wordpress 表的数据库。 我想清理一下,所以我正在寻找一个可以根据前缀表名删除表的查询。

在这种情况下,我想删除所有以“_wordpress_1_”开头的表

   _wordpress_1_eruiweuriw
   _wordpress_2_jshfiojdwi
   _wordpress_1_fksdjfksdj
   _wordpress_1_fskdjfksdf
   _wordpress_3_kfsjdfsdkf

所以我在尝试:

 USE database_name;
 SELECT * FROM database_name WHERE TABLE_NAME LIKE '%_wordpress_1_%';

我想我不能在 where 语句中使用 like 作为表名,而只能用于表列?? 我能否获得有关如何实现这一目标的任何提示?

【问题讨论】:

  • SELECT table_name FROM information_schema.tables WHERE table_schema = 'your_database_name' AND table_name LIKE '%_wordpress_1_%';?
  • SELECT table_name ? -> 我想删除多个具有相同前缀名称的表
  • 你需要动态SQL的存储过程。

标签: mysql wordpress phpmyadmin


【解决方案1】:
CREATE PROCEDURE drop_all_tables (IN dbase TEXT, IN prefix TEXT)
BEGIN
SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name))
INTO @sql
FROM information_schema.tables 
WHERE table_schema = dbase 
  AND table_name LIKE CONCAT(prefix, '%');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
-- and now cry if you make a mistake in parameters
END

然后

CALL drop_all_tables ('wordpress_database', '_wordpress_1_');

【讨论】:

  • 谢谢,我会测试的。可以使用相同的过程将具有相同前缀的所有表复制到另一个数据库中吗?
  • @Dho 不,您不能在一个语句中复制多个表。您需要在光标上循环,并逐表复制。
【解决方案2】:

你不能只用一个 MySQL 命令,你可以使用 MySQL 为你构造语句:

在 MySQL shell 或 PHPMyAdmin 中,粘贴以下查询并更改前缀:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 2011-10-13
    • 1970-01-01
    • 2019-04-14
    • 2018-03-20
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多