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

删除与某些通配符匹配的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值