KingbaseES 可更新的视图
可更新视图
可简化视图可自动更新:系统将允许在视图上使用 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
这个选项控制自动可更新视图的行为。这个选项被指定时,将检查该视图上的 INSERT和UPDATE命令以确保新行满足 视图的定义条件(也就是,将检查新行来确保通过视图能看到它们)。如果新行 不满足条件,更新将被拒绝。如果没有指定CHECK OPTION, 会允许该视图上的INSERT和UPDATE命令 创建通过该视图不可见的行。支持下列检查选项:
LOCAL只根据直接定义在该视图本身的条件检查新行。任何定义在底层基视图上的 条件都不会被检查(除非它们也指定了
CHECK OPTION)。CASCADED会根据该视图和所有底层基视图上的条件检查新行。如果
CHECK OPTION被指定,并且没有指定LOCAL和CASCADED,则会假定为CASCADED。
CHECK OPTION不应该和RECURSIVE视图一起使用。
可更新用例
只包含一个表或可简化视图
/*更新后,记录行从结果集中不可见*/
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;
检查子查询
/*更新后,记录行从结果集中可见*/
create view v_t22 as select * from t22_h where id > 0 WITH CHECK OPTION;
update v_t22 set id = 10 where id = 1;
包含多个表
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;
不可更新用例
只读视图
create view v_t22 as
with virtab as (select) select * from t22_h where id > 0 ;
改变结果集
create view v_t22 as select * from t22_h where id > 0 WITH CHECK OPTION;
update v_t22 set id = -1 where id = 1;
FROM子查询
create view v_t22_1 as select * from (select * from t22_h) v_t22 where id > 0 ;
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 ;
包含 UNION, INTERSECT, 或 EXCEPT
create or replace view v_t221 as
select * from t22_h
union all
select * from t22_h;
包含任何聚合、窗口函数或集合返回函数
create or replace view v_t221 as
select * ,row_number() over () sn
from t22_h ;
包含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 可更新的视图的更多相关文章
- SQL入门(1): 创建/查询/更新/连接/视图/SSMS简介
本文介绍SQL的基本查询语句 (1) select... from * 表示全部, 选择的东西还可以进行简单的运算, 可以列别名 select * from student; -sage from ...
- vue---数据更新,视图不更新问题
写点赞功能时,点赞后已经追加到对象里了,但是视图没有更新. 查找了些资料: 数据已经更新了但是视图不更新的问题,有几个原因: 1.根属性不存在,而想要直接给根属性赋值导致的视图不更新.此时初始化属性的 ...
- Android中使用异步线程更新UI视图的几种方法
在Android中子线程是不能更新ui的. 所以我们要通过其他方式来动态改变ui视图, 1.runOnUiThreadactivity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要 ...
- vue 路由更新页面视图未更新问题
最近项目做面包屑的时候遇到一个问题就是路由变化的时候页面视图并没有发生变化,后来上网查,发现是vue-router的特性导致的. vue-router的切换不同于传统的页面的切换.路由之间的切换,其实 ...
- MySQL 学习笔记(二):数据库更新、视图和数据控制
基础准备: 在 school 数据库下建立student.course.sc 三个表: create table student( Sno ) primary key, Sname ) unique, ...
- SQL基础-更新&删除&视图
一.更新数据 1.更新数据 ### 更新全部数据: 使用UPDATE关键字.语法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新学生表中的所有学生性别为男: UPDATE stude ...
- defineProperty在数据劫持后是如何通知数据的更新和视图的更新的
vue的双向绑定是由数据劫持结合发布者-订阅者模式实现的,那么什么是数据劫持?vue是如何进行数据劫持的?说白了就是通过Object.defineProperty()来劫持对象属性的setter和ge ...
- Android中不能在子线程中更新View视图的原因
这是一条规律,很多coder知道,但原因是什么呢? 如下: When a process is created for your application, its main thread is ded ...
- SQL Server修改表结构后批量更新所有视图
最近修改了数据库表结构,数据同步的时候出了问题,发现很多数据明明已经修改,但是通过视图筛选出来的还是原来的数据,所以怀疑应该是视图缓存了数据,在园子里找到下面的博文,在这里做个记录备忘. 原文链接:h ...
- 由于物化视图定义为on commit导致update更新基表慢的解决方案
由于物化视图定义为on commit导致update更新基表慢的解决方案 以下是模拟和解决测试过程: (模拟update慢的过程) 1.首先基于基表创建物化视图日志: create materiali ...
随机推荐
- flask+xlswriter+axios导出Excel
flask后端 starttime = request.json.get('starttime') endtime = request.json.get('endtime') # 根据时间查询数据库数 ...
- CF1398C Good Subarrays(写给我们萌新团体)
Good Subarrays 传送门: Good Subarrays - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 暴力!!!!! 一如既往的暴力!!! 复杂度O(n^2) ...
- nmap top N端口获取
使用nmap 扫描时可能会扫描tcp top100 top1000 端口, 有时需要去配置文件提取,配置文件路径/usr/share/nmap/nmap-services, 具体根据实际安装情况调整: ...
- pikachu sql inject bool盲注
输入框中输入 已知用户名 kobe 显示了用户信息 your uid:3 your email is: kobe@pikachu 输入kobe'看一下情况 显示 您输入的username不存在,请重新 ...
- heapq模块通过nlargest()和nsmallest()找到最大或最小的N个元素
问题 我们想在某个集合中找出最大或最小的N个元素 解决方案 heapq模块中有两个函数nlargest()和nsmallest() import heapq nums = [1,8,2,23,7,-4 ...
- Kotlin 协程五 —— 在Android 中使用 Kotlin 协程
目录 一.Android MVVM 结构 二.添加依赖 三.在后台线程中执行 3.1 协程解决了什么问题 3.2 保证主线程安全 3.3 withContext 的性能 四.结构化并发 4.1 追踪协 ...
- ZYNQ核心板及其底板开源啦!
Hello-FPGA ZYNQ 设计开源啦! 开源ZYNQ核心板 + 底板 硬件设计.软件设计,软件设计使用裸机演示,演示了如何使用AXI DMA等关键dma 模块 欢迎加QQ 讨论 94755958 ...
- 私有git服务器搭建-gitlib版
目录 环境 centos6.5 这里有官网安装地址教程: 这里有机器配置安装需求 CPU Memory 安装步骤 安装配置依赖项 添加GitLab仓库,并安装到服务器上 启动GitLab 配置 git ...
- 以Servlet来解释 抽象实现类
在 Java Servlet API 中: Servlet 接口定义了一个 Servlet 的基本行为.这个接口是抽象的,因为它包含抽象方法,比如 service(), init(), 和 destr ...
- Nessus 离线安装
Nessus是渗透测试用来进行漏洞扫描的一款经常使用的工具,除此之外还是用AWVS ,APPScan后面在介绍.今天先把Ness如何离线安装到自己本机步骤说明. 安装步骤: 1.下载Nessus 官网 ...