postgresql数据库中update使用的坑

简介

        在数据库中进行增删改查比较常见,经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别,oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多,这就导致数据在被新的时候出现不确定性。

目录

简介

案列

oracle

postgresql

解读

postgresql官网解释

update语法分享

update对分区表使用的影响

案列

oracle

以下oracle数据库中的测试代码

drop table test1;create table test1 (id number ,var varchar2(2) ) ;insert into test1 values(1,2);
select * from test1;update test1 tset var =(select tt.varfrom (select 1 id, '3' varfrom dualunion allselect 1, '4'from dual) ttwhere tt.id = t.id);select * from test1;       

postgresql

以下是postgresql数据库中的测试代码

 
drop table if exists test1;create table test1 (id int ,var varchar ) ;select * from test1;insert into test1 values(1,2);update test1 t set var=tt.var from (select 1,generate_series(3,4)::varchar ) as tt(id,var) where  tt.id = t.id;select * from test1;

解读

在两个数据库中都是新建了一张表,其数据只有(1,2),其中id:1是作为set的匹配字段

       

替换新数据表中,其ID为1的值有两个,在set进行匹配的时候就会发生一对多(数据发散)的情况,此时oracle数据库就会报错

select 1 id, '3' varfrom dualunion allselect 1, '4'from dual

一对多(数据发散)的情况,此时oracle数据库就会报错。在oracle数据库中是并不允许的。

但是在postgresql数据库中却可以执行,并且主表数据库被成功更新成了4.

postgresql官网解释

在官网中,postgresql是支持set后的一对多匹配的,但是具体更新成哪一条数据却是不可控的。


注:在日常使用postgresql数据库的时候,注意update语句在使用中,尽可能有唯一主键进行关联。
        其SET后匹配的数据尽可能保证一对一的关联。

update语法分享

 WITH [ RECURSIVE ] with_query [, ...] ]
UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]SET { column_name = { expression | DEFAULT } |( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) |( column_name [, ...] ) = ( sub-SELECT )} [, ...][ FROM from_item [, ...] ][ WHERE condition | WHERE CURRENT OF cursor_name ][ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

         此处的RECURSIVE,递归语法语法的一个关键字,可以对临时表的数据进行聚合算法。

update对分区表使用的影响

        在查询这个一对多进行update执行的时候,官网还对其分区表的分区键进行update后,会不会变更其分区进行了解读:

        在分区表的情况下,更新一行有可能导致它不再满足其所在分区的分区约束。此时,如果这个行满足分区树中某个其他分区的分区约束,那么这个行会被移动到那个分区。 如果没有这样的分区,则会发生错误。在后台,行的移动实际上是一次DELETE操作和一次INSERT操作。

        在移动的行上的并发UPDATEDELETE可能会收到序列化失败错误。 假设会话 1 正在分区键上执行UPDATE,同时,对可访问该行的并发会话 2 在此行上执行UPDATEDELETE操作。 在这种情况下,会话 2 的UPDATE 或 DELETE将检测行移动并引发序列化失败错误(该错误始终返回 SQLSTATE 代码"40001")。 如果发生这种情况,应用程序可能希望重试事务。 在通常情况下,表没有分区或没有行移动,会话 2 将标识新更新的行,并执行UPDATE/DELETE在此新行版本中。

        请注意,虽然行可以从本地分区移动到外表分区(如果外数据包装器支持元组路由),但它们不能从外表分区移动到另一个分区。

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

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

相关文章

完整的工程项目管理流程是怎么样的?

阅读本文你将了解工程项目管理的完整流程:一、项目启动阶段;二、项目规划阶段;三、项目执行阶段;四、项目收尾阶段;五、项目总结与反馈。 这是一个工程项目管理的完整流程: 项目启动阶段:也就…

xlsxwriter.exceptions.FileCreateError: [Errno 13] Permission denied: ‘E:

xlsxwriter.exceptions.FileCreateError: [Errno 13] Permission denied: ‘E:\、、、、、’ 如果你尝试了各种修改文件权限的方法都还不行的话 有可能是因为你打开了想要修改的文件,关闭就好啦

Android12 ROM定制导读

一、前言 本专栏出现的原因: 沉淀自己,距离上一篇博客已经过去几个月了,笔者最近工作上的事情非常忙,导致博文断更了,今天忙里偷闲有一段短暂的时间,把这段时间遇到的问题准备整理一下,以文章的形式记录下来。Android10的专栏也会慢慢更新。让笔者最为感慨的就是Androi…

C语言分支限界法求解01背包问题

分支限界法是一种求解优化问题的算法,针对01背包问题,它可以通过在搜索过程中剪枝,减少搜索空间的大小,提高算法的效率。 具体来说,分支限界法会将当前状态下的可行解集合分成若干个子集,每个子集代表一条…

Java特殊文件读取案例Properties

代码 package com.itheima.d1;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.util.Properties;public class Test3 {public static void main(String[] args) throws Exception {//目标:读取属性文件…

SpringBoot通过@Scheduled实现定时任务

Spring自带的定时任务系统,使用注解时必须指定任意一个参数(属性):cron、fixedDelay或fixedRate; 1. 启动类添加开启注解 EnableScheduling 2. cron参数 /** * cron 一共可以有7个参数 以空格分开 其中年不是必须参…

java项目之品牌银饰售卖平台(ssm+vue)

项目简介 主要功能包括首页、个人中心、用户管理、促销活动管理、饰品管理、我的收藏管理、系统管理、订单管理等。管理员模块: 管理员可以查询、编辑、管理每个用户的信息和系统管理员自己的信息,同时还可以编辑、修改、查询用户账户和密码,以及对系统…

EMG肌肉电信号处理合集(三)

本文主要展示常见的肌电信号预处理的实现,开发环境为matlab。 目录 1 肌电信号低通,高通,带通滤波 2 去除DC 0阶偏置,1阶偏置 3 全波整流 4 信号降采样 5 linear envolope / butterworth 低通滤波器 1 肌电信号低通&#xf…

pdf.js插件怎么控制工具栏的显示与隐藏

最近做了一个需求,需要实现pdf文件的预览,但是只是提供预览功能,不需要展示相关的工具栏,所以需要把工具栏隐藏掉。我用的插件是pdf.js 官网地址:http://mozilla.github.io/pdf.js/ 中文文档地址:https://…

邻趣连接力:如何无代码集成CRM、电商平台和营销系统,提升广告推广效率

连接即服务:邻趣无代码集成方法 传统的电商系统集成过程需要大量的时间和资源进行API开发,这不仅耗时耗力,还需要专业的技术团队支持。然而,邻趣通过提供一种无需API开发的连接方法,极大地简化了整个集成过程。商家只…

vue3 滚动条回到顶部

需求&#xff1a; 在页面a&#xff0c;滑动了滚动条&#xff0c;再进入页面b&#xff0c;但是页面B记录了滚动条位置 现在想要&#xff0c;进入页面B,不记录之前的滚动条&#xff0c; 代码 //页面B <div class"center" ref"centerRef">页面B </…

信号...

信号的产生&#xff1a;外卖小哥给我打电话说你外卖到了 信号的保存&#xff1a;我可能正在推高地&#xff0c;脑子里面记住我外卖到了&#xff0c;一会再去拿 信号的处理&#xff1a;我打完了&#xff0c;下楼把外卖拿了 完成了一次信号的生命周期

VSDX Annotator v1.16.1(Visio 绘图注释工具)

VSDX Annotator是一款在Mac上操作MSVisio绘图的工具&#xff0c;提供了广泛的注释可能性&#xff0c;以及在多平台环境中共享可视文档。它确保共有12个注释工具&#xff0c;并允许添加注释、标注、注释、块、图形文件等。该应用程序允许用户在Mac上查看Visio流程图、图表、方案…

Cartographer实现双雷达建图

Urdf修改 <?xml version="1.0" ?> <robot name="robot"><link name="base_link" /><link name="laser_1" /><link name="laser_2" /><link name="laser_link" /><join…

13.什么是Spring beans?

什么是Spring beans&#xff1f; Spring 官方文档对 bean 的解释是&#xff1a; In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assem…

大数据-计算框架选型与对比

计算框架选型与对比 一、大数据平台二、计算框架分类1.批处理架构2.实时流处理架构3.流批一体处理架构 三、计算框架关键指标1.处理模式2.可伸缩性3.消息传递3.1 至少一次&#xff08;at least once&#xff09;3.2 至多一次&#xff08;ai most once&#xff09;3.3 恰好一次&…

边海防可视化智能视频监控与AI监管方案,助力边海防线建设

一、背景与需求 我国有3万多公里的边境线和海岸线&#xff0c;随着我国边海防基础设施建设的快速发展&#xff0c;边海安防也逐渐走向智能化。传统人工巡防的方式已经无法满足边海智能化监管的需求&#xff0c;在沿海、沿边地区进行边海智慧安防视频监控系统等边海防基础设施建…

智慧海岛/海域方案:助力海洋空间智慧化、可视化管理

随着我国海洋经济的快速发展&#xff0c;海域海岛的安防技术也获得了进步。传统的安防监控模式已经满足不了海域海岛的远程监管需求。伴随着人工智能、边缘计算、大数据、通信传输技术、视频技术、物联网等信息化技术的发展&#xff0c;海岛海域在监管手段上&#xff0c;也迎来…

【Spring Cloud实战】分布式系统控制与组件应用

在现代软件开发中&#xff0c;分布式系统已经成为一种常见的架构模式&#xff0c;被广泛应用于各种规模的企业和组织中。这种架构模式通过将应用程序拆分为独立的组件&#xff0c;并分布在不同的计算机节点上运行&#xff0c;使得系统能够应对高负载和大规模的数据处理需求&…

python tkinter使用(四)

本篇文章主要讲下tkinter 的文本框相关. tkinter中用Entry来实现输入框,类似于android中的edittext. 具体的用法如下: 1:空白输入框 如下: name tk.Entry(window) name.pack()2: 设置输入框的默认文案 name tk.Entry(window) name.pack() name.insert(tk.END, "请…