2015-11-06 71 views
0

没有表是否有一个MySQL命令可以这样做:删除数据库如果在它

如果没有在数据库中,删除它。如果里面有桌子,什么都不要做。

如:

drop database if exists foobar 

但是:

drop database if empty foobar 

有没有办法做到这一点?

+1

你可以很容易地写一个存储过程,通过查询'INFORMATION_SCHEMA.TABLES'做到这一点。 – Barmar

+0

你必须编写一个存储过程,在这种情况下,普通的drop database是不够的。 –

+0

@Barmar似乎就是这样。我是SQL新手,有没有任何文档或示例? –

回答

1

希望这也能帮助其他人。在阅读您的问题和评论员的评论后,我只是为了自己的目的创建了一个程序。

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 

请测试这个 - 生产服务器上,并确认它确实你想要它做的事情。

+0

有趣的:)我已经测试了这个在我自己的电脑上,它工作正常。有没有办法选择我想要删除的数据库而不是所有的数据库? –

+1

是的。绝对。为名为p_schema_name的过程创建一个参数。在group by之前添加where子句:where s.schema_name = p_schema_name。如果没有表格,调用procname('test111')可以删除test111 – zedfoxus

+0

谢谢,这真的很有帮助:P –

1

由于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() 
+0

好吧,因为我对SQL没有更多的了解,但似乎这不适用于我的mariadb。它说'错误1064(42000):你的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以获得在' '附近使用的正确语法'BEGIN BEGIN '在第1行 '处打印('有测试数据库中有表格')。 –

+0

现在它不会引发错误,但似乎仍然不起作用。 '(SELECT COUNT(table_name)from INFORMATION_SCHEMA.tables WHERE Table_Schema ='mariadb')'做什么? –

+0

@KevinGuan,该语句将计算数据库中的表的数量(mariadb)。我已经添加到条件来检查是否有表,那么它不应该删除数据库。如果它等于'= 0',那么数据库必须下降。 – MAK