我需要删除数百个共享公共前缀的mysql数据库,但是随机id为其名称的其余部分(例如,database_0123456789,database_9876543210).所有这些数据库都在同一台服务器上.我不想丢弃同一台服务器上的其他数据库.
这就是我想做的事情:
DROP DATABASE `database_*`;
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地放弃这些?我可以运行MySQL查询吗?也许是一个shell脚本?
spe*_*593 28
该DROP DATABASE语句的语法仅支持单个数据库名称.您需要DROP DATABASE为每个数据库执行单独的语句.
您可以运行查询以返回数据库名称列表,或者可能更有帮助,以生成您需要运行的实际语句.如果要删除以文字字符串开头的所有数据库database_(包括下划线字符),则:
SELECT CONCAT('DROP DATABASE `',schema_name,'` ;') AS `-- stmt`
FROM information_schema.schemata
WHERE schema_name LIKE 'database\_%' ESCAPE '\\'
ORDER BY schema_name
Run Code Online (Sandbox Code Playgroud)
复制该查询的结果,您就拥有了一个SQL脚本.
(将结果保存为纯文本文件(例如dropdbs.sql),使用您喜欢的文本编辑器进行检查以删除任何愚蠢的页眉和页脚行,确保脚本看起来正确,保存它,然后从mysql命令行工具,mysql> source dropdbs.sql. )
显然,你可能会比这更复杂,但对于一次性拍摄,这可能是最有效的.)
不需要外部脚本文件.使用prepare语句的存储过程可能会起到作用:
CREATE PROCEDURE kill_em_all()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE dbname VARCHAR(255);
DECLARE cur CURSOR FOR SELECT schema_name
FROM information_schema.schemata
WHERE schema_name LIKE 'database\_%' ESCAPE '\\'
ORDER BY schema_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO dbname;
IF done THEN
LEAVE read_loop;
END IF;
SET @query = CONCAT('DROP DATABASE ',dbname);
PREPARE stmt FROM @query;
EXECUTE stmt;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
完成该程序后,您只需:
CALL kill_em_all();
Run Code Online (Sandbox Code Playgroud)
完成后:
DROP PROCEDURE kill_em_all
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21083 次 |
| 最近记录: |