2015-11-06 66 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