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.pswp.cn/news/163762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163762.shtml
英文地址,請注明出處:http://en.pswp.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, "請…