mysql中視圖更新詳解


視圖的可更新性與視圖中查詢的定義是有關的

一、mysql中那些試圖使不可更新的?以下類型的視圖是不可更新的

1.包含以下關鍵字的sql語句:聚合函數(sum、min、max、count)、distinct、group by 、having、union或者uinon all

2.常量視圖

3.select 中包含子查詢

4.join

5.from一個不可更新的試圖

6.where字句的子查詢引用了from字句中的表

二、更新視圖條件限制

WITH[CASCADED | LOCAL] CHECK OPTION確定了更新視圖的條件。

LOCAL代表只要滿足本視圖的條件就可以更新

CASCADED 則必須滿足所有針對該視圖的所有視圖條件才可以更新

如果沒有明確是local還是cascade,默認是cascade

為了便於理解還是通過實例來說明

已知t3表的數據結構如下:


-- 創建視圖 ldq_t1
CREATE VIEW ldq_t1 AS
SELECT
*
FROM
t3
WHERE id1 > 10 WITH CHECK OPTION ;
-- 查詢ldq_t1中的所有結果
SELECT * FROM ldq_t1;

-- 創建視圖 ldq_t2
CREATE VIEW ldq_t2 AS
SELECT
*
FROM
ldq_t1
WHERE id1 < 30 WITH LOCAL CHECK OPTION ;

-- 創建視圖 ldq_t3
CREATE VIEW ldq_t3 AS
SELECT
*
FROM
ldq_t1
WHERE id1 < 30 WITH CHECK OPTION ;

-- 更新視圖ldq_t2(只有ldq_t2中存在的數據都可以更新)
SELECT * FROM ldq_t2; -- 查看ldq_t2當前記錄
UPDATE ldq_t2 SET id1=5 WHERE id2=22; -- 可以執行成功
UPDATE ldq_t2 SET id1=35 WHERE id2=22; -- 將會報錯CHECK OPTION failed(因為執行該語句之后,id2=22記錄將從ldq_t2消失)
UPDATE ldq_t2 SET id1=28 WHERE id2=22; -- 可以執行成功


-- 更新ldq_t3
SELECT * FROM ldq_t3;
UPDATE ldq_t3 SET id1=5 WHERE id2=22; -- 將會報錯CHECK OPTION failed(因為數據更新之后,必須還要保證其仍然在ldq_t3和ldq_t1之中,該語句執行后id2=22記錄將從ldq_t1消失)
UPDATE ldq_t3 SET id1=15 WHERE id2=22; -- 能夠執行成功
UPDATE ldq_t3 SET id1=35 WHERE id2=22; -- 將會報錯CHECK OPTION failed(因為執行該語句之后,id2=22記錄將從ldq_t3消失)
DELETE FROM ldq_t3 WHERE id2=22; -- 執行成功
總結:WITH LOCAL CHECK OPTION 修飾的視圖,在更新的時候,只需要保證更新后的記錄仍然存在該視圖中就可以了,否認報錯。而WITH CASCADED CHECK OPTION修飾視圖,必須保證更新后的記錄仍然存在該視圖以及跟該視圖有關系的試圖中就可以了。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com