暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

金仓数据库KingbaseES 可更新的视图

数据猿 2023-04-20
612

可更新视图

可简化视图可自动更新:系统将允许在视图上使用 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

这个选项控制自动可更新视图的行为。这个选项被指定时,将检查该视图上的 INSERTUPDATE命令以确保新行满足 视图的定义条件(也就是,将检查新行来确保通过视图能看到它们)。如果新行 不满足条件,更新将被拒绝。如果没有指定CHECK OPTION, 会允许该视图上的INSERTUPDATE命令 创建通过该视图不可见的行。支持下列检查选项:

  • LOCAL

    只根据直接定义在该视图本身的条件检查新行。任何定义在底层基视图上的 条件都不会被检查(除非它们也指定了CHECK OPTION)。

  • CASCADED

    会根据该视图和所有底层基视图上的条件检查新行。如果 CHECK OPTION被指定,并且没有指定 LOCALCASCADED,则会假定为 CASCADED

CHECK OPTION不应该和RECURSIVE视图一起使用。

可更新用例

  1. 只包含一个表或可简化视图

    /*更新后,记录行从结果集中不可见*/ 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;
  2. 检查子查询

    /*更新后,记录行从结果集中可见*/ create view v_t22 as select * from t22_h where id > 0 WITH CHECK OPTION; update v_t22 set id = 10 where id = 1;
  3. 包含多个表

    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;

不可更新用例

  1. 只读视图

    create view v_t22 as with virtab as (select) select * from t22_h where id > 0 ;
  2. 改变结果集

    create view v_t22 as select * from t22_h where id > 0 WITH CHECK OPTION; update v_t22 set id = -1 where id = 1;
  3. FROM子查询

    create view v_t22_1 as select * from (select * from t22_h) v_t22 where id > 0 ;
  4. 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 ;
  5. 包含 UNION, INTERSECT, 或 EXCEPT

    create or replace view v_t221 as select * from t22_h union all select * from t22_h;
  6. 包含任何聚合、窗口函数或集合返回函数

    create or replace view v_t221 as select * ,row_number() over () sn from t22_h ;
  7. 包含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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论