可更新视图

可简化视图可自动更新:系统将允许在视图上使用 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. wordpress设置固定链接404及伪静态配置

    说明 最近在将wordpress设置中文章url修改为月份和名称型 之后访问文章出现404.原因是配有配置好apache的伪静态. 配置步骤 1.修改httpd.conf 我这里是centos7,默认 ...

  2. spring boot+bootstrap实现动态轮播图实战

    1.bootstrap轮播图 最近开发了个网站需要用到轮播图,正好前端用的是Bootstrap,这里就实战一下. 水平一般能力有限,仅供参考. 前提条件: bootstrap4.5 jquery 3张 ...

  3. golang指针和结构体

    指针 指针操作 指针包括指针地址.指针类型和指针取值 &: &符号放在变量前面进行取地址操作 **:*放在变量前面根据地址进行取值 指针地址: func main() { var a ...

  4. Go 中的反射 reflect 介绍和基本使用

    一.什么是反射 在计算机科学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问.检测和修改它本身状态或行为的一种能力.用比喻来说,反射就是程序在运行的时候能够&qu ...

  5. Jenkins下载插件报错

    只要看日志报了什么错 下载超时 更新代理源https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 报unable ...

  6. WSL2镜像文件压缩

    WSL2的镜像文件(*.vhdx)支持自动扩容,但是一般不会自动缩容.一旦某次存放过大文件以后,即使后续删除,镜像文件体积仍然不会缩小,导致大量磁盘空间浪费.因此,可以定期对镜像文件进行手动压缩. 镜 ...

  7. MySQL和Redis基本安装和配置

    MySQL 下载和安装 mysql官网下载:https://dev.mysql.com/downloads/mysql/ 下载后将目录下的bin路径加入到环境变量中 在安装目录下创建 my.ini 配 ...

  8. 【Azure 事件中心】Event Hubs如何获取其中存放的历史消息

    问题描述 使用Azure Event Hub服务,除了正常的生产,消费消息以外,如果想拿到Event Hub中存储的历史消息?有什么方法呢? 问题解答 获取 Event Hubs 存储的历史消息,首先 ...

  9. [linux 爬坑] 几个linux发行版尝试和令人崩溃的ssr安装体验

    最近电脑上的manjaro好像出了问题,长时间不用就会死机.也懒得追究原因了,正好决定尝试几个发行版.首先尝试安装银河麒麟    这个发行版实际上就是ubuntu,甚至源什么的都是ubuntu的,也不 ...

  10. 为Oracle链接服务器使用分布式事务

    1 现象 在SQL Server中创建指向Oracle的链接服务器,SQL语句在事务中向链接服务器插入数据.返回链接服务器无法启动分布式事务的报错. 2 解决 在Windows平台下,SQL Serv ...