当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《删除与某些通配符匹配的MySQL数据库?》经验,为你挑选了3个好方法。

我在服务器中运行mySQL,我需要丢弃大量的数据库(在使用服务器进行一些测试之后).我需要删除的所有数据库都有相同的前缀"Whatever_".

在前缀之后,名称是随机的.所以你有你的Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast.

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

编辑: 我可以使用任何类型的语言或插入mysql ...所以我们可以在某些方面做到这一点.现在,我问那个正在生成数据库的人给我一个.txt,每个名字都在一行......所以即时编码一个快速的php,它将获取一个文件并删除其中的所有数据库,稍后我会尝试%答案(如果它有效,它需要正确的答案,以确保它更简单的方式).无论如何,我想这样做更容易,因为我不能支持这个代码(其他人会,你知道......)

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



1> Shalom Craim..:

基本思想是在数据库中运行"show tables",并使用其中的结果来选择所需的表.我不认为MySQL允许你对"show tables"中的结果集做任何事情,但我可能错了.

这是一个使用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".通过下一个命令管道输出(|符号表示"管道",如传递):

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"命令时要小心!



2> tver3305..:

scraimer的答案原则是正确的,但由于问题是关于丢弃数据库而不是数据库中的表,正确的命令应该是:

mysql -u your_username -p'your password' -e 'show databases' 
| grep Whatever_* 
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`"

有关该命令的说明,请查看scraimer的解释.

最后一位...... \`@@ \`我们在bacticks(`)中引用了我们生成的数据库名称,以防我们的数据库名称有特殊字符,如`-`

干杯



3> 小智..:

我们可以使用存储过程执行此操作.这是下面的一个:

drop procedure if exists droplike;
delimiter //
create procedure droplike(pattern varchar(20))
begin
  set group_concat_max_len = 65535;
  select @drop:= concat( 'drop table ', group_concat(table_name) , ';' ) from information_schema.tables where table_schema = "database_name" and table_name like pattern;
  prepare statement from @drop;
  execute statement;
end //
delimiter ;

将database_name替换为数据库的名称(需要写入权限).要删除带有XYZ模式的表,请使用输入作为XYZ调用该过程,然后使用外卡,如下所示:

call droplike("XYZ%");

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有