MySQL視圖更新

昨天在寫美團2019秋招筆試題的時候遇到了關於視圖是否能更新的問題,突然感覺這個問題之前複習的時候重點關注過,但是卻又想不全。今天特地搜了一些資料總結一下。本文主要說明視圖的更新限制,如需關於視圖的更多知識,參考:MySql視圖原理講解與使用大全

  1. 視圖簡介
    1. 視圖不是表,不能直接存儲數據,是一張虛擬的表,視圖和數據庫的表存在着對應的關係,我們在某些情況下是可以通過視圖來操作數據庫的表,這樣可以簡化查詢操作(一般情況下視圖是用來查詢用的),在某種條件下是可以利用視圖來更新數據庫表中的數據的,後面會提到視圖的更新。
    2. 一般情況下,在創建有條件限制的視圖時,加上 "WITH CHECK OPTION"命令
  2. 視圖的更新問題 某些視圖是可更新的。也就是說,可以在UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內容。對於可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關係。如果視圖包含下述結構中的任何一種,那麼它就是不可更新的:
    1. 聚合函數(SUM(), MIN(), MAX(), COUNT()等)。
    2. DISTINCT
    3. GROUP BY
    4. HAVING
    5. UNION或UNION ALL
    6. 位於選擇列表中的子查詢
    7. Join
    8. FROM子句中的不可更新視圖
    9. WHERE子句中的子查詢,引用FROM子句中的表。
    10. 僅引用文字值(在該情況下,沒有要更新的基本表)。
    11. ALGORITHM = TEMPTABLE(使用臨時表總會使視圖成爲不可更新的)。

注意: 視圖中雖然可以更新數據,但是有很多的限制。一般情況下,最好將視圖作爲查詢數據的虛擬表,而不要通過視圖更新數據。因爲,使用視圖更新數據時,如果沒有全面考慮在視圖中更新數據的限制,就可能會造成數據更新失敗。

WITH[CASCADED|LOCAL] CHECK OPTION能不能決定視圖是否能更新?

  1. 這兩個參數的基本定義如下: LOCAL參數表示更新視圖時只要滿足該視圖本身定義的條件即可。 CASCADED參數表示更新視圖時需要滿足所有相關視圖和表的條件。沒有指明時,該參數爲默認值。
  2. 對於with check option用法,總結如下:
    1. 視圖只操作它可以查詢出來的數據,對於它查詢不出的數據,即使基表有,也不可以通過視圖來操作。
    2. 對於update,有with check option,要保證update後,數據要被視圖查詢出來
    3. 對於delete,有無with check option都一樣
    4. 對於insert,有with check option,要保證insert後,數據要被視圖查詢出來
    5. 對於沒有where 子句的視圖,使用with check option是多餘的

本文參考:MySql視圖原理講解與使用大全 和之前視圖學習筆記 如需轉載請註明出處:https://www.cnblogs.com/zhuchenglin/p/9602569.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章