可更新视图
可简化视图可自动更新:系统将允许在视图上使用 INSERT、UPDATE 和 DELETE 语句,就像在常规表上一样。如果视图满足以下所有条件,就是可简化视图,则视图可自动更新:
- 该视图的 FROM 列表中必须只有一个条目,该条目必须是一个表或另一个可更新的视图。
- 视图定义不得在顶层包含 WITH、DISTINCT、GROUP BY、HAVING、LIMIT 或 OFFSET 子句。
- 视图定义不得包含顶层的集合操作(UNION、INTERSECT 或 EXCEPT)。
- 视图的选择列表不得包含任何聚合、窗口函数或集合返回函数
检查可更新的视图信息
SELECT
table_name,
is_updatable
FROM
information_schema.views
where table_name = 'viewname'
只读视图
KingbaseES视图定义语法不含限制只读子句,但是可提供了一种将视图明确定义为 read-only 的方法。
列出了视图的只读限制,如果满足以下所有条件,则视图不可更新:
- 该视图的 FROM 列表中超过一个条目,该条目必须是一个表或另一个可更新的视图。
- 视图定义在顶层包含 WITH、DISTINCT、GROUP BY、HAVING、LIMIT 或 OFFSET 子句。
- 视图定义包含顶层的集合操作(UNION、INTERSECT 或 EXCEPT)。
- 视图的选择列表包含任何聚合、窗口函数或集合返回函数。
因此,如果您的视图不满足所有这些条件,则它是只读的。如果您想将一个可简化的视图设为只读,一个(次优)选项是调整其定义,使其违反上述规则之一。
例如,您可以添加一个虚拟WITH
子句:
CREATE VIEW myview AS
WITH virtab AS (SELECT )
-- 实际的视图定义
WITH [ CASCADED | LOCAL ] CHECK OPTION
这个选项控制自动可更新视图的行为。这个选项被指定时,将检查该视图上的 INSERT
和UPDATE
命令以确保新行满足 视图的定义条件(也就是,将检查新行来确保通过视图能看到它们)。如果新行 不满足条件,更新将被拒绝。如果没有指定CHECK OPTION
, 会允许该视图上的INSERT
和UPDATE
命令 创建通过该视图不可见的行。支持下列检查选项:
-
LOCAL
只根据直接定义在该视图本身的条件检查新行。任何定义在底层基视图上的 条件都不会被检查(除非它们也指定了
CHECK OPTION
)。 -
CASCADED
会根据该视图和所有底层基视图上的条件检查新行。如果
CHECK OPTION
被指定,并且没有指定LOCAL
和CASCADED
,则会假定为CASCADED
。
CHECK OPTION
不应该和RECURSIVE
视图一起使用。
可更新用例
-
只包含一个表或可简化视图
/*更新后,记录行从结果集中不可见*/ create view v_t22 as select * from t22_h; create view v_t22_1 as select * from v_t22 where id > 0 ; update v_t22 set id = -1 where id = 1; update v_t22_1 set id = -1 where id = 1;
-
检查子查询
/*更新后,记录行从结果集中可见*/ create view v_t22 as select * from t22_h where id > 0 WITH CHECK OPTION; update v_t22 set id = 10 where id = 1;
-
包含多个表
FROM必须是单表,但可以在select或where 读取多个表。
create or replace view v101 as select h.id, h.seq, array(select name from t22_b b where h.id = b.h_id) name from t22_h h where id in (select id from t22_b b where h.id = b.h_id) ; update v101 set seq = 0 where id = 10;
不可更新用例
-
只读视图
create view v_t22 as with virtab as (select) select * from t22_h where id > 0 ;
-
改变结果集
create view v_t22 as select * from t22_h where id > 0 WITH CHECK OPTION; update v_t22 set id = -1 where id = 1;
-
FROM子查询
create view v_t22_1 as select * from (select * from t22_h) v_t22 where id > 0 ;
-
FROM多表
create view v_t22 as select h.id,h.seq,b.name from t22_h h, t22_b b where h.id=b.id ;
-
包含 UNION, INTERSECT, 或 EXCEPT
create or replace view v_t221 as select * from t22_h union all select * from t22_h;
-
包含任何聚合、窗口函数或集合返回函数
create or replace view v_t221 as select * ,row_number() over () sn from t22_h ;
-
包含START WITH或CONNECT BY
create view v_tree as select * from t_tree start with id = 5 connect by id = prior parentid;
可更新视图的问题
1、含rownum虚列
create or replace view v_t22 as
select * ,rownum sn from t22_h ;
--更新之后,因位置改变,造成数据不符合预想。
select * from v_t22;
id | seq | sn
----+-----+----
1 | 0 | 1
2 | 0 | 2
3 | 0 | 3
4 | 0 | 4
5 | 0 | 5
update v_t22 set seq = 10000 where rownum = 1;
update 1
select * from v_t22;
id | seq | sn
----+-------+----
2 | 0 | 1
3 | 0 | 2
4 | 0 | 3
5 | 0 | 4
1 | 10000 | 5
标签:where,更新,视图,t22,KingbaseES,id,select,view
From: https://www.cnblogs.com/kingbase/p/17140260.html