2009-09-21 143 views
1

我想保留t1,t2並刪除所有其他表。是否有MySQL命令來實現類似「除t1,b2之外的刪除表」?

+0

如果你想刪除所有的表,但不是數據庫本身,你會用什麼?使用相同的技巧,但排除這些... – 2009-09-21 12:54:33

+0

@Workshop亞歷克斯,抱歉,沒有抓住你。 – omg 2009-09-21 12:57:55

+0

通常,當您想要刪除所有表格時,您只需刪除數據庫。 (這也將刪除可能會失效的存儲過程和視圖。)如果您只想刪除表格,則必須逐個刪除它們。如果你想刪除所有的,除了這兩個,你仍然必須逐一刪除它們,但跳過需要保留的刪除。 – 2009-09-21 13:08:24

回答

6

您可以使用information_schema查找表名,甚至將結果格式化爲一堆DROP語句。

SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ') 
    FROM information_schema.tables 
    WHERE table_schema = DATABASE() AND table_name NOT IN ('foo', 'bar', 'baz'); 

(該DATABASE()函數返回當前use「d數據庫)。

使用PREPAREEXECUTE,你甚至可以避開復制粘貼&,以及(在MySQL 5.0.13及更高版本)寫一個存儲程序來做到這一點。

+0

這就是我的意思。 :-)或者類似的東西。 – 2009-09-21 13:06:39

+1

我會非常小心地把它放在實時代碼中。 刪除表通常是dbadmin或cron/control任務,而不是應編碼的內容。否則,絕對不應該將表的權利交給可能稍後易受XSS影響的實時代碼。 – 2009-09-21 13:27:42

1

你可以使用mysqldump生成DROP TABLE語句的列表,過濾掉你不想要的操作,然後管回入mysql客戶端。下面是我們如何構建起來

首先,這裏的數據庫

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \ 
grep ^DROP 

現在我們可以管,通過與-v grep來反轉匹配DROP TABLE表語句列表 - 我們要聲明其別「T何況我們保留(另一種方式來做到這一點是 - 忽略表選項mysqldump的)表

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \ 
grep ^DROP | 
grep -v 'foo\|bar' 

最後,一旦你有信心,你可以通過管道將回到MySQL的

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \ 
grep ^DROP | \ 
grep -v 'foo\|bar' | \ 
mysql -uUSERNAME -pPASSWORD DATABASE 
相關問題