2012-01-13 31 views

Trả lời

6

Trích dẫn từ MySQL Reference Manual:

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

DROP VIEW loại bỏ một hoặc nhiều lượt xem. Bạn phải có đặc quyền DROP cho mỗi chế độ xem. Nếu bất kỳ khung nhìn nào được đặt tên trong danh sách đối số không tồn tại, MySQL trả về một lỗi chỉ ra bằng tên mà các khung nhìn không tồn tại mà nó không thể thả, nhưng nó cũng làm giảm tất cả các khung nhìn trong danh sách tồn tại.

Điều khoản IF EXISTS ngăn không cho xảy ra lỗi cho các chế độ xem không tồn tại. Khi mệnh đề này được đưa ra, một NOTE được tạo cho mỗi chế độ xem không tồn tại. Xem Mục 12.7.5.41, “Cảnh báo HIỂN THỊ Cú pháp”.

RESTRICTCASCADE, nếu được, được phân tích cú pháp và bỏ qua.

+4

tôi nghĩ anh ấy hỏi làm thế nào để thả tất cả trong một thời trang tự động. Không phải cách tra cứu thủ công và viết câu lệnh thả cho số lượt xem tùy ý. – Cerin

2

thử mã chưa được kiểm tra này

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

sẽ thả tất cả các chế độ xem trên máy chủ, không phải trong một db :) –

+0

Cảm ơn bạn, iv đã cập nhật tập lệnh – CloudyMarble

-1

Dưới đây là một phương pháp của Ruby sẽ làm những gì bạn muốn:

# @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

Tôi đã sử dụng này một:

/* 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

Câu trả lời hay nhất tại đây, cảm ơn. –

+1

Kịch bản hay, thx. Và bởi vì GROUP_CONCAT, giống như SET GLOBAL group_concat_max_len = 1000000; có thể hữu ích. –

+1

Tôi đã phải 'đặt @@ group_concat_max_len = 100000; 'để làm việc này! Nếu bạn có 100 lượt xem và tên giản đồ cộng với tên chế độ xem dài hơn 10 ký tự, bạn dễ dàng vượt qua giới hạn 1024 mặc định. – Fx32

Các vấn đề liên quan