MySQL視圖更新

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

  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視圖原理講解與使用大全 和以前視圖學習筆記
如需轉載請註明出處:http://www.javashuo.com/article/p-hgetoloa-gx.html.net

相關文章
相關標籤/搜索