可更新视图

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

KingbaseES 可更新的视图的更多相关文章

  1. SQL入门(1): 创建/查询/更新/连接/视图/SSMS简介

    本文介绍SQL的基本查询语句 (1) select... from  * 表示全部, 选择的东西还可以进行简单的运算, 可以列别名 select * from student; -sage from ...

  2. vue---数据更新,视图不更新问题

    写点赞功能时,点赞后已经追加到对象里了,但是视图没有更新. 查找了些资料: 数据已经更新了但是视图不更新的问题,有几个原因: 1.根属性不存在,而想要直接给根属性赋值导致的视图不更新.此时初始化属性的 ...

  3. Android中使用异步线程更新UI视图的几种方法

    在Android中子线程是不能更新ui的. 所以我们要通过其他方式来动态改变ui视图, 1.runOnUiThreadactivity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要 ...

  4. vue 路由更新页面视图未更新问题

    最近项目做面包屑的时候遇到一个问题就是路由变化的时候页面视图并没有发生变化,后来上网查,发现是vue-router的特性导致的. vue-router的切换不同于传统的页面的切换.路由之间的切换,其实 ...

  5. MySQL 学习笔记(二):数据库更新、视图和数据控制

    基础准备: 在 school 数据库下建立student.course.sc 三个表: create table student( Sno ) primary key, Sname ) unique, ...

  6. SQL基础-更新&删除&视图

    一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE stude ...

  7. defineProperty在数据劫持后是如何通知数据的更新和视图的更新的

    vue的双向绑定是由数据劫持结合发布者-订阅者模式实现的,那么什么是数据劫持?vue是如何进行数据劫持的?说白了就是通过Object.defineProperty()来劫持对象属性的setter和ge ...

  8. Android中不能在子线程中更新View视图的原因

    这是一条规律,很多coder知道,但原因是什么呢? 如下: When a process is created for your application, its main thread is ded ...

  9. SQL Server修改表结构后批量更新所有视图

    最近修改了数据库表结构,数据同步的时候出了问题,发现很多数据明明已经修改,但是通过视图筛选出来的还是原来的数据,所以怀疑应该是视图缓存了数据,在园子里找到下面的博文,在这里做个记录备忘. 原文链接:h ...

  10. 由于物化视图定义为on commit导致update更新基表慢的解决方案

    由于物化视图定义为on commit导致update更新基表慢的解决方案 以下是模拟和解决测试过程: (模拟update慢的过程) 1.首先基于基表创建物化视图日志: create materiali ...

随机推荐

  1. scrcpy-Android投屏神器

    介绍 scrcpy 是免费开源的投屏软件,支持将安卓手机屏幕投放在 Windows.macOS.GNU/Linux 上,并可直接借助鼠标在投屏窗口中进行交互和录制. 下载scrcpy 解压. http ...

  2. Django实战之文件上传下载

    项目介绍 最近学习django,通过文件上传下载这个小项目,总结下常用的知识点. 做这个案例我有以下需求: 1.要支持一次上传多个文件 2.支持上传后记录上传的数据以及列表展示 3.支持下载和删除文件 ...

  3. 网站(>???<)

    http://cpeditor.org/ https://csacademy.com/app/graph_editor/ https://www.cnblogs.com/zhangyi1357/p/1 ...

  4. java面向对象之封装-继承-抽象-多态-组合五种概念及用法一网打尽

    说明 曾经在学习java面向对象时,你是否会为面向对象的封装-继承-抽象-多态-组合等各种概念搞得稀里糊涂,乃至反复阅读,背诵其相关概念,结果一段时间过后又还给了时间... 这种经历简直令人发指,让人 ...

  5. 原来你是这样的JAVA--[07]聊聊Integer和BigDecimal

    今天来聊聊Java中跟数值处理相关的两个类型Integer和BigDecimal. 说起这两个类型,我们肯定都不陌生,但是其中有些容易踩到的坑需要注意避让. Integer 整型我们应该每天都会用到, ...

  6. virtualapp启动流程源码分析

    virtualapp启动流程分析 1. 首先是启动本身,执行Vpp 的attachBaseContext @Override protected void attachBaseContext(Cont ...

  7. 【LeetCode贪心#10】划分字母区间(有涉及hash数组的使用)

    划分字母区间 力扣题目链接(opens new window) 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中.返回一个表示每个字符串片段的长度的列表 ...

  8. Google Test Adapter安装

    背景 我有一个vs2015 的gtest 工程,编译完成后,需要gtest adapter帮我把测试列表显示出来,但是通过vs自带的工具或者网页下载安装遇到2个问题: 1.下载速度超级慢,慢到我能到火 ...

  9. 05、secs协议常见问题分析以及如何建立通信

    1.建立通信 在主机和设备之间发送SECS-II消息之前,必须首先"建立"通信.这是通过S1F13(建立通信请求)消息来完成的.这应该是在初始启动后或在长时间不通信之后发送的第一个 ...

  10. 一文了解 Nebula Graph DBaaS 服务——Nebula Graph Cloud Service

    Nebula Graph DBaaS 作为一款 DBaaS(DataBase as s Service)的产品,Nebula Graph Cloud Service 极大地降低了研发人员使用 Nebu ...