2012-01-13 25 views

回答

6

MySQL Reference Manual引用:

DROP VIEW [IF EXISTS] 
    view_name [, view_name] ... 
    [RESTRICT | CASCADE] 

DROP VIEW移除一個或多個視圖。您必須擁有每個視圖的DROP權限。如果任何在參數列表中命名的視圖不存在,MySQL將返回一個錯誤,指出其名稱不能刪除的不存在的視圖,但它也會刪除列表中存在的所有視圖。

IF EXISTS子句可防止不存在的視圖發生錯誤。當給出該子句時,將爲每個不存在的視圖生成一個NOTE。請參閱第12.7.5.41節「SHOW WARNINGS Syntax」

RESTRICTCASCADE,如果給出,將被解析並忽略。

+4

我認爲他是詢問如何以自動化的方式全部放棄。不是如何手動查找和寫入任意數量視圖的drop語句。 – Cerin 2013-05-24 15:10:01

2

試試這個未經測試的代碼

DECLARE VIEW_NAME VARCHAR(31); 
DECLARE VIEW_NAMES CURSOR 
FOR 
SELECT table_name 
FROM information_schema.views; 
WHERE table_schema = 'DB_Name' 
OPEN VIEW_NAMES; 
REPEAT 
FETCH VIEW_NAMES INTO VIEW_NAME; 
DROP VIEW VIEW_NAME  
UNTIL done END REPEAT; 
CLOSE VIEW_NAMES; 
END; 
+1

這將刪除所有在服務器上的意見,而不是在一個分貝:) – 2012-02-01 22:00:56

+0

謝謝,iv更新腳本 – CloudyMarble 2012-02-02 05:26:36

-1

下面是一個Ruby方法,將你想要做什麼:

# @param [Array] databases, e.g. ['db1', 'db2'] 
    def drop_all_views(databases) 
    views = ActiveRecord::Base.connection.execute("SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA IN('#{databases.join("', '")}');") 

    views = views.to_a.flatten 

    # Then drop all of those views from their respective databases 
    views.each do |v| 
     ActiveRecord::Base.connection.execute("DROP VIEW IF EXISTS #{v};") 
    end 
    end 
11

我一直在使用這一個:

/* DROP ALL VIEWS */ 

SET @views = NULL; 
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @views 
FROM information_schema.views 
WHERE table_schema = @database_name; -- Your DB name here 

SET @views = IFNULL(CONCAT('DROP VIEW ', @views), 'SELECT "No Views"'); 
PREPARE stmt FROM @views; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

最好的答案在這裏,謝謝。 – 2014-05-21 22:50:18

+1

不錯的腳本,thx。並且因爲GROUP_CONCAT,像SET GLOBAL group_concat_max_len = 1000000;可能是有用的。 – 2016-06-15 19:49:59

+1

我不得不'設置@@ group_concat_max_len = 100000;'這個工作!如果您有100個視圖,並且架構名稱和視圖名稱長度超過10個字符,則您可以輕鬆傳遞默認的1024個限制。 – Fx32 2017-11-09 12:35:25

相關問題