我在服务器中运行mySQL,我需要丢弃大量数据库(在使用服务器进行一些测试之后)。我需要删除的所有数据库都有相同的前缀“Whatever _”。
在前缀之后,名称是随机的。所以你有你的Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast。
我会做这个工作很多次,所以我想知道最好的方法是什么?
修改 我可以使用任何类型的语言或插入mysql ...所以我们可以在某些方面做到这一点。现在,我问那个正在生成数据库的人给我一个.txt,每个名字都在一行......所以即时编码一个快速的php,它将获取一个文件并删除其中的所有数据库,稍后我会尝试%答案(如果它有效,它需要正确的答案,以确保它更简单的方式)。无论如何,我想这样做更容易,因为我无法支持这个代码(其他人会,你知道......)
编辑2: 使用通配符不起作用:#1008 - 无法删除数据库'whatever_%';数据库不存在
答案 0 :(得分:80)
基本思想是在数据库中运行“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”命令时要小心!
答案 1 :(得分:26)
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(`)中引用了我们生成的数据库名称,以防我们的数据库名称具有特殊字符,如`-`
干杯
答案 2 :(得分:12)
我们可以使用存储过程来完成此操作。以下是一个:
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%");
答案 3 :(得分:1)
我认为你无法删除MySql中的多个数据库。
但我有一个非常讨人喜欢的解决方案。您可以使用C / C ++ / C#/ JAVA编程,将“DROP DATABASE WHATEVER_<name>;
”多次打印到记事本或任何文本编辑器中。之后,您可以在MySql的客户端命令提示符中复制粘贴,然后就可以了。不要忘记每个;
命令后的“DROP
”。
我相信这是可能的。试着写这个。
答案 4 :(得分:1)
这个(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 )
答案 5 :(得分:1)
这里有一些不错的整洁解决方案。但是我所做的只是:
SHOW TABLES LIKE 'migrate%';
在MySQL工作台中。
然后,我将结果复制到一个可以使用转义序列查找/替换的体面的文本编辑器中,然后将\n
替换为;\nDROP TABLE
,并整理开始和结束位置。然后复制回MySQL工作台。比某些建议的解决方案更手动,更不美观,但实际上同样快捷。
答案 6 :(得分:0)
如果有人正在寻找一个反映抓取器和资源管理器的简单答案,但是使用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<String> databases = new ArrayList<String>();
while (rs.next()) databases.add(rs.getString(1));
for (String s : databases){
Statement st = connection.createStatement();
st.execute("drop database " + s);
}
connection.close();
}
}
警告:如果您不希望对SQL服务器进行搜查,请不要向客户或其他开发人员展示。
答案 7 :(得分:-1)
很抱歉,我们不能使用sql命令一次删除多个数据库
答案 8 :(得分:-2)
DROP DATABASE `any-database_name`;
我只是在数据库名称之前和之后使用此字符`
(反引号)。
答案 9 :(得分:-4)
你可以尝试mysql 5 general purpose routine library (可从here下载)。使用它,您可以删除多个与正则表达式匹配的表。我建议仔细检查正则表达式,以防止丢弃你需要的表。
答案 10 :(得分:-7)
使用
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
声明为described here。
我不知道你是否可以使用野猫来做类似
的事情DROP DATABASE Whatever_%
但我认为你应该尝试一下。