我在服务器中运行mySQL,我需要丢弃大量的数据库(在使用服务器进行一些测试之后).我需要删除的所有数据库都有相同的前缀"Whatever_".
在前缀之后,名称是随机的.所以你有你的Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast.
我会做这个工作很多次,所以我想知道最好的方法是什么?
编辑: 我可以使用任何类型的语言或插入mysql ...所以我们可以在某些方面做到这一点.现在,我问那个正在生成数据库的人给我一个.txt,每个名字都在一行......所以即时编码一个快速的php,它将获取一个文件并删除其中的所有数据库,稍后我会尝试%答案(如果它有效,它需要正确的答案,以确保它更简单的方式).无论如何,我想这样做更容易,因为我不能支持这个代码(其他人会,你知道......)
编辑2: 使用通配符不起作用:#1008 - 无法删除数据库'whatever_%'; 数据库不存在
Sha*_*mer 83
基本思想是在数据库中运行"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 @@"
Run Code Online (Sandbox Code Playgroud)
这将打印出所有shell命令以删除以"Whatever_"开头的表.如果您希望它实际执行这些命令,请删除"echo"一词.
编辑:我忘了解释上面的内容!我不知道你对shell脚本的熟悉程度,但是这里有:
mysql -u your_user -D your_database_name -e "show tables" -s
Run Code Online (Sandbox Code Playgroud)
打印出所有表的列表,标题为"Tables_in_your_database_name".通过下一个命令管道输出(|符号表示"管道",如传递):
egrep "^Whatever_"
Run Code Online (Sandbox Code Playgroud)
搜索任何开始的行(^符号表示"有生命")单词"Whatever_"并仅打印那些.最后,我们通过命令管道"Whatever_*"表的列表:
xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"
Run Code Online (Sandbox Code Playgroud)
它接受表名列表中的每一行,并在命令中插入它而不是"@@"
echo mysql -u your_user -D your_database_name -e "DROP TABLE @@"
Run Code Online (Sandbox Code Playgroud)
因此,如果你有一堆名为"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"
Run Code Online (Sandbox Code Playgroud)
哪个会输出以下内容:
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"
Run Code Online (Sandbox Code Playgroud)
我希望这是足够的细节,而且我不仅仅是因为信息过多而殴打任何人.祝你好运,并使用"DROP TABLE"命令时要小心!
tve*_*305 30
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 \`@@\`"
Run Code Online (Sandbox Code Playgroud)
有关该命令的说明,请查看scraimer的解释.
最后一位...... \`@@ \`我们在bacticks(`)中引用了我们生成的数据库名称,以防我们的数据库名称有特殊字符,如`-`
干杯
小智 14
我们可以使用存储过程执行此操作.这是下面的一个:
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 ;
Run Code Online (Sandbox Code Playgroud)
将database_name替换为数据库的名称(需要写入权限).要删除带有XYZ模式的表,请使用输入作为XYZ调用该过程,然后使用外卡,如下所示:
call droplike("XYZ%");
Run Code Online (Sandbox Code Playgroud)
这里有一些不错的整洁的解决方案。但我所做的只是:
SHOW TABLES LIKE 'migrate%';
Run Code Online (Sandbox Code Playgroud)
在 MySQL 工作台中。
然后我将结果复制到一个不错的文本编辑器中,该编辑器可以使用转义序列查找/替换,并替换为\n,;\nDROP TABLE 并整理开始和结束。然后复制回MySQL工作台。与一些建议的解决方案相比,需要更多的手动操作,但不太优雅,但实际上同样快。
| 归档时间: |
|
| 查看次数: |
51696 次 |
| 最近记录: |