沒有表是否有一個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新手,有沒有任何文檔或示例? –