檢視的可更新性與檢視中查詢的定義是相關的
#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修飾視圖,必須保證更新後的記錄仍然存在該視圖以及跟該視圖有關係的試圖中就可以了。