一尘不染

删除与某些通配符匹配的MySQL数据库?

sql

我在需要删除大量数据库的服务器上运行mySQL(在对服务器进行一些测试之后)。我需要删除的所有数据库都具有相同的前缀“ Whatever_”。

在前缀之后,名称是随机的。因此,您拥有了Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast。

我会做很多次这项工作,所以我想知道这样做的最佳方法是什么?

编辑:
我可以使用任何一种语言或mysql的插件…所以我们可以以某种方式做到这一点。现在,我问正在生成数据库的那个人给我一个.txt,其中每个名称都在一行中…所以我正在编码一个快速的php,它将取一个文件并删除其中的所有数据库,稍后我将尝试%答案(如果可行,则可以确定正确答案,以确保采用更简单的方法)。无论如何,我想以更简单的方式来执行此操作,因为我将无法支持此代码(其他人也会,而且您知道…)

编辑2: 使用通配符无效:#1008-无法删除数据库“ whatever_%”;数据库不存在


阅读 152

收藏
2021-03-17

共1个答案

一尘不染

基本思想是在数据库中运行“显示表”,并使用从中获得的结果来选择所需的表。我认为MySQL无法让您使用“显示表​​”的结果集执行任何操作,但我可能错了。

这是使用shell的快捷解决方案:

mysql -u your_user -D your_database_name -e "show tables" -s | 
  egrep "^Whatever_" | 
  xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

这将打印出所有shell命令,以删除以“ Whatever_”开头的表。如果您希望它实际执行这些命令,请删除单词“ echo”。

编辑 :我忘了解释以上!我不知道您对Shell脚本的熟悉程度,但是可以这样:

mysql -u your_user -D your_database_name -e "show tables" -s

打印出所有表的列表,标题为“ Tables_in_your_database_name”。该命令的输出通过下一条命令通过管道传递(|符号表示“
piped”,如传递的一样):

egrep "^Whatever_"

搜索单词“ Whatever_”开头的任何行(^符号表示“存在于”),仅打印这些行。最后,我们通过以下命令通过管道传递“ Whatever_ *”表的列表:

xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

它采用表名称列表中的每一行,并将其插入而不是命令中的“ @@”

echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"

因此,如果您有一堆名为“ Whatever_1”,“ Whatever_2”,“ Whatever_3”的表,则生成的命令将是:

echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1"
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2"
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3"

将输出以下内容:

mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1"
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2"
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3"

我希望这是足够的细节,而且我不只是要用太多的信息来殴打任何头上的人。祝您好运,并在使用“ DROP TABLE”命令时要当心!

2021-03-17