删除与某些通配符匹配的MySQL数据库?
我在需要删除大量数据库的服务器上运行mySQL(在对服务器进行一些测试之后)。 我需要删除的所有数据库都具有相同的前缀“ Whatever”。
在前缀之后,名称是随机的。 因此,您拥有了Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast。
我会做很多次这项工作,所以我想知道什么是最好的方法?
编辑:我可以使用任何一种语言或mysql插件...因此我们可以通过某些方式做到这一点。 现在,我问正在生成数据库的那个人给我一个.txt,其中每个名称都一行。 %答案(如果可行,则可以确定正确答案,以确保采用更简单的方法)。 无论如何,我想以更简单的方式执行此操作,因为我将无法支持此代码(其他人也可以,并且您知道...)
编辑2:无法使用通配符:#1008-无法删除数据库“ whatever%”; 数据库不存在
DFectuoso asked 2019-12-30T15:41:43Z
11个解决方案
82 votes
基本思想是在数据库中运行“显示表”,然后使用该结果选择您想要的表。 我认为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”命令时要小心!
Shalom Craimer answered 2019-12-30T15:42:35Z
29 votes
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(`)中引用最终的数据库名称。
干杯
tver3305 answered 2019-12-30T15:43:08Z
14 votes
我们可以使用存储过程来做到这一点。 以下是其中之一:
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%");
Explorer answered 2019-12-30T15:43:33Z
1 votes
好吧,我认为您不能在MySql中删除多个数据库。
但是我有一个非常令人讨厌的解决方案。 您可以使用C / C ++ / C#/ JAVA进行编程,以在记事本或任何文本编辑器中多次打印“ DROP DATABASE WHATEVER_;”。 之后,您可以在MySql的客户端命令提示符中复制粘贴,然后就可以开始了。 在每个DROP命令之后,请不要忘记“ ;”。
我相信这是可能的。 试试写这个。
arshabh answered 2019-12-30T15:44:02Z
1 votes
那(Jython)呢?
rs = stmt.executeQuery( "SHOW DATABASES LIKE 'Whatever_%'" )
databases_for_dropping = []
while rs.next():
databases_for_dropping.append( rs.getString( 1 ))
for database_for_dropping in databases_for_dropping:
stmt.execute( "DROP DATABASE %s" % database_for_dropping )
mike rodent answered 2019-12-30T15:44:22Z
1 votes
这里有一些不错的整洁解决方案。 但是我所做的只是:
SHOW TABLES LIKE 'migrate%';
在MySQL工作台中。
然后,我将结果复制到一个可以使用转义序列查找/替换的体面的文本编辑器中,然后将\n替换为;\nDROP TABLE,并整理开始和结束位置。 然后复制回MySQL工作台。 比一些建议的解决方案更手动,更不优雅,但实际上同样快捷。
james-geldart answered 2019-12-30T15:44:53Z
0 votes
如果有人在寻找一个简单的答案,该答案与scraimer和Explorer相似,但使用JDBC用Java编写(我知道我是),那么这里有一个快速而又肮脏的答案,可以为我完成工作:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class DatabaseDeleter {
// Pass your database wildcard as the only argument to program ( "%MY_CRAZY_PATTERN%")
public void main(String[] args) throws SQLException, ClassNotFoundException{
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://databaseURL");
PreparedStatement pst = connection.prepareStatement("show databases like ?");
pst.setString(1, args[0]);
ResultSet rs = pst.executeQuery();
ArrayList databases = new ArrayList();
while (rs.next()) databases.add(rs.getString(1));
for (String s : databases){
Statement st = connection.createStatement();
st.execute("drop database " + s);
}
connection.close();
}
}
警告:如果您不希望洗劫SQL Server,请不要向客户甚至其他开发人员透露。
depthfirstdesigner answered 2019-12-30T15:45:18Z
-1 votes
抱歉,我们无法使用sql命令一次删除多个数据库
Warrior answered 2019-12-30T15:45:37Z
-3 votes
DROP DATABASE `any-database_name`;
我只在数据库名称之前和之后使用此字符`(反引号)。
sanya_sp answered 2019-12-30T15:45:58Z
-4 votes
您可以尝试mysql 5通用例程库(可从此处下载)。 使用它,您可以删除多个匹配正则表达式的表。 我建议仔细检查正则表达式,以防止删除所需的表。
Yuval F answered 2019-12-30T15:46:20Z
-7 votes
使用
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
声明如此处所述。
我不知道您是否可以使用通配符来执行类似的操作
DROP DATABASE Whatever_%
但我认为您应该尝试一下。
Xn0vv3r answered 2019-12-30T15:46:53Z