可更新视图

可简化视图可自动更新:系统将允许在视图上使用 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. 【framework】应用进程启动流程

    1 前言 Activity启动流程 中介绍了从点击桌面上应用快捷方式到 Activity 的 onCreate() 方法调用流程,本将介绍应用进程的启动流程.由于应用进程启动流程复杂,本文按进程将其拆 ...

  2. JetBrains全系列软件激活教程激活码以及JetBrains系列软件汉化包

    最新激活方式 如果安装过无限试用.修改过 hosts 请先卸载干净旧版本再安装,否需无法激活! 以 WebStorm 为例 JetBrains官网 https://www.jetbrains.com/ ...

  3. Detours 的使用

    Detours 是一个用于在 ARM, ARM64, X86, X64 和 IA64 机器上拦截二进制函数的库. Detours 最常用来拦截应用程序中的 win32 api 调用,比如添加调试工具. ...

  4. windbg 分析 32 位进程的 64 位转储文件

    场景: x86 的项目在 x64 的 windows 机器上运行时出现未响应的情况,使用任务管理器创建该进程的转储文件 因为项目是 32 位的,所以使用 x86 的 windbg 来调试 dmp 文件 ...

  5. c++复习笔记——STL(vector)

    c++-----STL容器系列(1) vector 1 介绍 Vector是stl容器中一种常见的容器 ,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vecto ...

  6. SpringCloud Sentinel使用

    1. 简介 Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统负载保护.热点防护等多个维度来帮助开发者保障微服务的稳定性.替换原先Hystrix ...

  7. 修改html5 placeholder文字默认颜色

    注意: 1.input后面的冒号不要写错! 2.-moz后面是没有input字样,火狐设置字体颜色为#000,但是他不是全黑,好像有个度似的!(个人认为) input:-ms-input-placeh ...

  8. C++追根究底(持续更新)

    目录 头文件 " " 与 <>的区别 带 .h 和不带 .h 的区别 带 c前缀 和不带 c前缀 的区别 宏定义 特殊符号:#,##,#@ 防止一个头文件被重复包含 d ...

  9. uniapp踩坑记录

    sessionStorage.setItem('token', data.msg)uni.setStorage('token', res.data); 搞了半天登录后直接通过获取getstorage获 ...

  10. Java双重循环实现任意字符串中提取数字子串

    public class Test2{  public static void main(String[] args) {   String s = "211ahn678rh2kkk0731 ...