首页 > 其他分享 >KingbaseES 可更新的视图

KingbaseES 可更新的视图

时间:2023-02-23 19:57:17浏览次数:28  
标签:where 更新 视图 t22 KingbaseES id select view

可更新视图

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


标签:where,更新,视图,t22,KingbaseES,id,select,view
From: https://www.cnblogs.com/kingbase/p/17140260.html

相关文章