標籤:youdao com HERE 用法 csdn min 語句 之間 注意
昨天在寫美團2019秋招筆試題的時候遇到了關於視圖是否能更新的問題,突然感覺這個問題之前複習的時候重點關注過,但是卻又想不全。今天特地搜了一些資料總結一下。本文主要說明視圖的更新限制,如需關於視圖的更多知識,參考:MySql視圖原理講解與使用大全
- 視圖簡介
- 視圖不是表,不能直接儲存資料,是一張虛擬表,視圖和資料庫的表存在著對應的關係,我們在某些情況下是可以通過視圖來操作資料庫的表,這樣可以簡化查詢操作(一般情況下視圖是用來查詢用的),在某種條件下是可以利用視圖來更新資料庫表中的資料的,後面會提到視圖的更新。
- 一般情況下,在建立有條件限制的視圖時,加上 "WITH CHECK OPTION"命令
視圖的更新問題
某些視圖是可更新的。也就是說,可以在UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內容。對於可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關係。如果視圖包含下述結構中的任何一種,那麼它就是不可更新的:
- 彙總函式(SUM(), MIN(), MAX(), COUNT()等)。
- DISTINCT
- GROUP BY
- HAVING
- UNION或UNION ALL
- 位於挑選清單中的子查詢
- Join
- FROM子句中的不可更新視圖
- WHERE子句中的子查詢,引用FROM子句中的表。
- 僅引用文字值(在該情況下,沒有要更新的基本表)。
- ALGORITHM = TEMPTABLE(使用暫存資料表總會使視圖成為不可更新的)。
注意:
視圖中雖然可以更新資料,但是有很多的限制。一般情況下,最好將視圖作為查詢資料的虛擬表,而不要通過視圖更新資料。因為,使用視圖更新資料時,如果沒有全面考慮在視圖中更新資料的限制,就可能會造成資料更新失敗。
WITH[CASCADED|LOCAL] CHECK OPTION能不能決定視圖是否能更新?
這兩個參數的基本定義如下:
LOCAL參數表示更新視圖時只要滿足該視圖本身定義的條件即可。
CASCADED參數表示更新視圖時需要滿足所有相關視圖和表的條件。沒有指明時,該參數為預設值。
- 對於with check option用法,總結如下:
- 視圖只操作它可以查詢出來的資料,對於它查詢不出的資料,即使基表有,也不可以通過視圖來操作。
- 對於update,有with check option,要保證update後,資料要被視圖查詢出來
- 對於delete,有無with check option都一樣
- 對於insert,有with check option,要保證insert後,資料要被視圖查詢出來
- 對於沒有where 子句的視圖,使用with check option是多餘的
本文參考:MySql視圖原理講解與使用大全 和之前視圖學習筆記
如需轉載請註明出處:https://www.cnblogs.com/zhuchenglin/p/9602569.html
MySQL視圖更新