从多表连接视图对比人大金仓和Oracle

news2024/11/21 1:28:52

1383d26feb3eb7a0220c7ead6b19a4b6.gif

a63faaf5c79d9b30d3c3c9709eea22eb.png

340fb6d7f1f1ba090bc34b29ad2f8758.png

KING BASE

2691aa925acf1bb96a3a1a0d53db7802.png

cbbec1d401307c9d6db782ab46dc7d31.png

信息时代,数据是驱动业务决策和创新的核心资源。然而,随着数据量的不断增加,有效地处理和整合数据的过程变得愈发复杂。这时,多表连接视图悄然走进数据库世界,不仅能够将多个表中的数据整合在一起,更加便捷,同时还以其可更新的特性,为数据管理带来了全新的可能性。

目前,多表连接视图功能在主流数据库中都被支持,但各数据库的功能表现有所不同(如下图)。KingbaseES支持的连接视图功能项和Oracle表现一致,完全兼容Oracle多表连接视图,并且比MySQL支持的功能更多。为此,本文将带您深入探索KingbaseES数据库中的多表连接视图及其可更新性。

7c5c9803a5a7a02b49fda742f58cee69.png

KingbaseES、Oracle和MySQL的功能对比

01

多表连接视图相关概念

多表连接视图是指构建视图的顶层查询引用了多个数据表,通过支持多表连接视图的更新操作,可以实现基于连接视图进行数据表的更新操作(DML),包括插入(INSERT)、更新(UPDATE)和删除(DELETE)。

视图(View)

视图是一种虚拟的表,是从一个或多个基本表中派生的,可以像表一样进行查询和更新操作。对于可更新视图,用户可以通过视图来更新基本表中的数据。

【单表视图】是指视图的查询只涉及单个数据表,如下例子中视图v1的查询中只包含表t1。

18a2c2eef4038ddb22b889264f93cf72.png

【多表视图】是指视图数据映射到多个基表。如下例子中视图v1是由表t1和t2组成,视图v1的数据与t1和t2中数据都存在映射关系。

93742c267ead17a2238a3c4019944c20.png

键保留表(Key-Preserved Table)

如果一个表的主键,是连接结果集的键,则称该表是键值保护的,也可以简单理解为存在一个单向的映射,视图中的每一行数据能唯一映射到基表中的一行数据。键保留表是理解多表连接视图是否可更新的基础,当多表连接视图的基表中存在一个或多个键保留表时,则该视图为可更新视图。

目标基表(Target Base Table)

对于多表连接视图进行更新操作时,会转换为对其中某一个基表的更新操作,实际更新的表称为目标基表。

目标基表与键保留表的关系

目标基表必须为键保留表。

02

多表连接视图背后机制

视图的更新操作

用户可以通多对视图进行更新操作实现对表数据的更新,可以减少编程的工作量,同时隐藏数据表的结构,实现数据对用户间不同的可见性,保证数据安全。对视图执行更新操作,最终会将更新操作(Insert/Update/Delete)重定向到某一个基表,从而实现对于基表的数据更新操作,视图中可能存在多个可以更新的基表(键保留表),每一条DML语句只能作用于一个数据表,本文后续内容主要讨论多表连接视图的更新问题。

视图的可更新性判断

当存在一个或多个键保留表时,我们认为这个视图中的键保留表是可以更新的。为了满足键保留表的条件,查询中不能存在影响查询结果集一一映射关系的子句,如:聚集、分组、集合操作等,这也是存在键保留表的先前条件。

多表视图由于存在不同的JOIN方式,以及连接列主键的不同情形,这时如何判断一个基表为键保留表呢?多表连接视图的可更新性和其查询中的连接方式有很大关系,到底如何判断视图列是否可以更新呢?

简单的等值连接的两表JOIN会存在以下情况

  • 两个表的连接列都不是主键:t1和t2组成视图v1且都不存在主键,则对于视图而言无键保留表。

10c24c03a778baa31b4928f15514cf57.png

  • 两个表的连接列都是主键列:Join类型是全外连接时不存在键保留表。若为左连接,左侧表可能是键保留表,右侧表不是键保留表。

2437a63e68ded629c8ab7bfc5056d6a2.png

若为右连接,同理,只是结论完全相反。若为内连接,视图的每一行能映射到与两个基表中的唯一一行,所以两个表都为键保留表。

0ba17339049b1d249b52061f06b89afe.png

  • 两个表的连接列只有一个是主键列

(1) Join类型是全外连接时不存在键保留表。

(2) Join类型如果为左连接,表T1的连接列不是主键,T2的连接列为主键,如图中组成的视图v1在T1中是可以找到唯一映射行的,满足键保留表的关系,所以T1为键保留表。同理右连接相反。

126cf687be960d3d4a871f01fb6c9758.png

4049a0646c887925535fd16b23e6d53a.jpeg

外连接与可更新视图

多表连接视图的可更新性和其查询中的连接方式有很大关系,因此为了更加准确的判断一个多表连接视图是否支持更新,需要对定义视图的查询进行必要的逻辑等价变换,在消除外连接后判断视图的可更新性。

如何判断视图列是否可以更新

  • 视图的列为直接查询的基表列

  • 更新的视图列必须是键保留表的相关列,即目标表必须为键保留表,最后的图例中只能更新视图中col_a和col_b两个列,另外两个列col_c和col_d是不能被更新的

  • 不可更新连接列

目标基表的选择

当用户对一个视图进行更新(Insert/Update/Delete)时,我们如何进行能知道用户想要操作的真正目标基表呢?

对于单表视图来说只有一个表,所以目标基表是明确的。对于多表视图而言此过程需要根据用户的DML语句的输入来识别目标基表。

  • 首先确认视图存在键保留表

  • 对于INSERT和UPDATE的目标基表如何选择?根据DML的目标列确认目标基表,目标列不能涉及多个表

  • 对于DELETE操作不存在视图的目标列信息,如何选择目标基表呢?选择第一个键保留表作为目标基表

视图重写过程

视图的更新实质上是对于基表的更新,在重写视图过程中涉及到哪些部分需要重写呢?

8254b8e8fe103d6559aa823d70f8daf6.png

视图所有表达式的引用关系都需要重定向为对目标基表的引用。若目标基表是视图(嵌套视图),则需要合并嵌套视图的查询到上层查询当中。

对于单表视图的with check option,可以合并到WHERE条件中;而对于多表视图,非目标基表的条件对更新操作而言并无作用,所以只需要提取目标基表的条件即可。

03

数据管理绝佳之选

多表连接视图实用示例与优势

在以下示例中视图emp_dept由表emp和dep组成,列deptno为表dep的主键,emp为键保留表,此视图为可更新的视图。

c88f6a0ef06594bdda0a00c82de5c6e9.png

9b63e48133a9cfb0d9def833721628ae.jpeg

如果我们无法通过连接视图直接进行更新操作,则需要编写一个更为复杂的SQL语句,并且要求对基表dep和emp有足够权限。示例如下:

c80ec0d83787c3aa5219544cfae33160.png

总结

多表连接视图支持可更新是一种非常有用的技术,可以屏蔽复杂的数据操作逻辑,使得数据管理变得更为简单和高效,不会因DML行为而暴露基础表,同时也限制了用户的访问范围和权限,保护数据的安全性和隐私性。因此也被广泛应用于各种数据库系统和数据管理应用中。

正如我们在本文中所探讨的,多表连接视图不仅是数据的魔法,更是我们应对数据复杂性的有力工具。作为数据库领域国家队,人大金仓将积极探索更高效、更智能的数据管理方法,释放数据的无限力量!

4ea62b94d499cbe246212c0e79d64bb0.png供稿:产品研发中心

编辑:王堇

审核:日尧

af463ef7acd2749af10ee2209f5beea9.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1225337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第四十八天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

文档讲解:代码随想录 视频讲解:代码随想录B站账号 状态:看了视频题解和文章解析后做出来了 121. 买卖股票的最佳时机 class Solution:def maxProfit(self, prices: List[int]) -> int:if len(prices) 0:return 0dp [[0] * 2 for _ in r…

二叉树前序,中序,后序遍历

前序遍历(递归): 中序遍历(递归):

2023全新付费进群系统源码 带定位完整版 附教程

这源码是我付费花钱买的分享给大家,功能完整。 搭建教程 Nginx1.2 PHP5.6-7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库(58soho.cn.sql) 第三步修改/config/database.php里面的数据库地址 第四步修改/conf…

qt-C++笔记之treeWidget初次使用

qt-C笔记之treeWidget初次使用 code review! 文章目录 qt-C笔记之treeWidget初次使用1.运行2.文件结构3.main.cpp4.widget.h5.widget.cpp6.widget.ui7.main.qrc8.qt_widget_test.pro9.options.png 1.运行 2.文件结构 3.main.cpp 代码 #include "widget.h"#include…

使用opera/火狐浏览器将网页固定到桌面和任务栏

1.单击Windows 图标,搜索Opera,右键单击它,然后选择Open file location 2.右键单击Opera,然后选择Show more options 3.将光标悬停在“发送到”选项上,然后选择“桌面(创建快捷方式)” 4.转到…

Android 弹出自定义对话框

Android在任意Activity界面弹出一个自定义的对话框,效果如下图所示: 准备一张小图片,右上角的小X图标64*64,close_icon.png,随便找个小图片代替; 第一步:样式添加,注意:默认在value…

leetcode系列(双语)003——GO无重复字符的最长子串

文章目录 003、Longest Substring Without Repeating Characters个人解题官方解题扩展 003、Longest Substring Without Repeating Characters 无重复字符的最长子串 Given a string s, find the length of the longest substring without repeating characters. 给定一个字符…

Linux非阻塞等待示例

Linux非阻塞等待实例 非阻塞等待的意义:简单的多进程编程示例代码解释 非阻塞等待的意义: 非阻塞等待在多进程编程中的意义主要体现在提高系统的响应性、实现异步任务执行、动态任务管理和多任务协同工作等方面。它允许父进程在等待子进程退出的同时&…

【SQL server】 表结构的约束和维护

表结构的约束和维护 修改表结构 (1)添加列 (2)删除列 (3)修改列alter table 表名 add 新列名 数据类型给员工表添加一列邮箱 alter table People add PeopleMail varchar(200)删除列 alter table People drop column PeopleMain修改列 alter table 表名 alter column 列名 数据…

Vulkan渲染引擎开发教程 一、开发环境搭建

一 安装 Vulkan SDK Vulkan SDK 就是我们要搞的图形接口 首先到官网下载SDK并安装 https://vulkan.lunarg.com/sdk/home 二 安装 GLFW 窗口库 GLFW是个跨平台的小型窗口库,也就是显示窗口,图形的载体 去主页下载并安装,https://www.glfw.…

CSS特效014:模仿钟摆效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

测不准原理

测不准原理 算符的对易关系 commutation relation 测不准原理的矢量推导 Schwarz inequality: 设对易关系: 设一个新态: 投影: 那么有: 代回Schwarz inequality 即可证明:

【机器学习算法】机器学习:支持向量机(SVM)

转载自: 【精选】机器学习:支持向量机(SVM)-CSDN博客 1.概述 1.1,概念 支持向量机(SVM)是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最…

java并发编程之基础与原理2

cpu缓存结构剖析 下面说一下概念与作用 CPU缓存即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储 器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中 保存着CPU刚用过或循环使用的一部…

UE 调整材质UV贴图长宽比例

首先,为什么要先减去0.5呢,因为缩放的贴图中心在0,0原点,以这个点缩放效果是这样: 它缩放的图案不会在正中间,因为是以0,0点进行缩放的 以这个图的箭头去缩放图片的,所以不能使得缩放后的图片放在正中心 那…

开源情报 (OSINT)

开源情报 (OSINT)是出于情报目的收集和分析公开数据的行为。 什么是开源数据? 开源数据是公众容易获得或可根据要求提供的任何信息。 OSINT 来源可包括: ▶ 报纸杂志文章以及媒体报道▶ 学术论文和发表的研究▶ 书籍和其他参考资料▶ 社交媒体活动▶…

【DevOps】Git 图文详解(四):Git 使用入门

Git 图文详解(四):Git 使用入门 1.创建仓库2.暂存区 add3.提交 commit 记录4.Git 的 “指针” 引用5.提交的唯一标识 id,HEAD~n 是什么意思?6.比较 diff 1.创建仓库 创建本地仓库的方法有两种: 一种是创建…

CMSIS-RTOS在stm32使用

目录: 一、安装和配置CMSIS_RTOS.1.打开KEIL工程,点击MANAGE RUN-TIME Environment图标。2.勾选CMSIS CORE和RTX.3.配置RTOS 时钟频率、任务栈大小和数量, 软件定时器. 二、CMSIS_RTOS内核启动和创建线程。1.包含头文件。2.内核初始化和启动。…

MySQL/Oracle用逗号分割的id怎么实现in (逗号分割的id字符串)。find_in_set(`id`, ‘1,2,3‘) 函数,

1.MySQL 1.1.正确写法 select * from student where find_in_set(s_id, 1,2,3); 1.2.错误示范 select * from student where find_in_set(s_id, 1,2 ,3); -- 注意,中间不能有空格。1、3 select * from student where find_in_set(s_id, 1,2, 3); -- 注意…

快速搜索多个word、excel等文件中内容

如何快速搜索多个word、excel等文件中内容 操作方法 以win11系统为介绍对象。 首先我们打开“我的电脑”-->“文件夹选项”-->“搜索”标签页,在“搜索内容”下方选择:"始终搜索文件名和内容(此过程可能需要几分钟)"。然后…