没有表是否有一个MySQL命令可以这样做:删除数据库如果在它
如果没有在数据库中,删除它。如果里面有桌子,什么都不要做。
如:
drop database if exists foobar
但是:
drop database if empty foobar
有没有办法做到这一点?
没有表是否有一个MySQL命令可以这样做:删除数据库如果在它
如果没有在数据库中,删除它。如果里面有桌子,什么都不要做。
如:
drop database if exists foobar
但是:
drop database if empty foobar
有没有办法做到这一点?
希望这也能帮助其他人。在阅读您的问题和评论员的评论后,我只是为了自己的目的创建了一个程序。
use mysql;
-- switch to a different delimiter
delimiter $$
create procedure drop_empty_databases()
begin
declare table_schema varchar(200); -- will hold schema obtained from query
declare schema_end int default 0; -- temp variable that's set to 1 when reading of all schema is done
-- cursor that lists all schemas with no tables
declare cur cursor for
select s.schema_name
from information_schema.schemata s
left join information_schema.tables t on t.table_schema = s.schema_name
group by s.schema_name
having count(t.table_name) = 0;
-- set schema_end to 1 when we run out of schemas while looping
declare continue handler for not found set schema_end = 1;
open cur;
looper: loop
fetch cur into table_schema;
if schema_end = 1 then
leave looper;
end if;
set @sql = concat('drop database ', table_schema);
prepare stmt from @sql;
execute stmt;
end loop;
close cur;
end
$$
-- switch back to semi-colon delimiter
delimiter ;
用法:
use mysql;
create database test123;
call drop_empty_databases(); -- test123 database should be gone after running this
请测试这个非 - 生产服务器上,并确认它确实你想要它做的事情。
有趣的:)我已经测试了这个在我自己的电脑上,它工作正常。有没有办法选择我想要删除的数据库而不是所有的数据库? –
是的。绝对。为名为p_schema_name的过程创建一个参数。在group by之前添加where子句:where s.schema_name = p_schema_name。如果没有表格,调用procname('test111')可以删除test111 – zedfoxus
谢谢,这真的很有帮助:P –
由于Barmar说你可以使用INFORMATION_SCHEMA.TABLES
存储过程。
这是我小的努力:
DELIMITER //
CREATE PROCEDURE spDropDB_IF_Empty()
BEGIN
IF (SELECT COUNT(table_name) from INFORMATION_SCHEMA.tables
WHERE Table_Schema = 'mariadb')= 0 THEN
DROP DATABASE mariadb;
ELSE
SELECT 'There are tables in the mariaDB';
END IF;
END //
DELIMITER ;
呼叫SP:
CALL spDropDB_IF_Empty()
好吧,因为我对SQL没有更多的了解,但似乎这不适用于我的mariadb。它说'错误1064(42000):你的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以获得在' '附近使用的正确语法'BEGIN BEGIN '在第1行 '处打印('有测试数据库中有表格')。 –
现在它不会引发错误,但似乎仍然不起作用。 '(SELECT COUNT(table_name)from INFORMATION_SCHEMA.tables WHERE Table_Schema ='mariadb')'做什么? –
@KevinGuan,该语句将计算数据库中的表的数量(mariadb)。我已经添加到条件来检查是否有表,那么它不应该删除数据库。如果它等于'= 0',那么数据库必须下降。 – MAK
你可以很容易地写一个存储过程,通过查询'INFORMATION_SCHEMA.TABLES'做到这一点。 – Barmar
你必须编写一个存储过程,在这种情况下,普通的drop database是不够的。 –
@Barmar似乎就是这样。我是SQL新手,有没有任何文档或示例? –