我在服务器中运行mySQL,我需要丢弃大量的数据库(在使用服务器进行一些测试之后).我需要删除的所有数据库都有相同的前缀"Whatever_".
在前缀之后,名称是随机的.所以你有你的Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast.
我会做这个工作很多次,所以我想知道最好的方法是什么?
编辑: 我可以使用任何类型的语言或插入mysql ...所以我们可以在某些方面做到这一点.现在,我问那个正在生成数据库的人给我一个.txt,每个名字都在一行......所以即时编码一个快速的php,它将获取一个文件并删除其中的所有数据库,稍后我会尝试%答案(如果它有效,它需要正确的答案,以确保它更简单的方式).无论如何,我想这样做更容易,因为我不能支持这个代码(其他人会,你知道......)
编辑2: 使用通配符不起作用:#1008 - 无法删除数据库'whatever_%'; 数据库不存在
基本思想是在数据库中运行"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"命令时要小心!
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(`)中引用了我们生成的数据库名称,以防我们的数据库名称有特殊字符,如`-`
干杯
我们可以使用存储过程执行此操作.这是下面的一个:
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%");