1. 程式人生 > >oracle的merge into操作詳解

oracle的merge into操作詳解

merge into的使用場景

一段業務邏輯,需要先判斷一條記錄在資料庫中是否有存在,若存在則更新該記錄,若不存在則插入記錄。
應用之前的做法是:
1、先用條件判斷記錄在資料庫中的個數。
2.1、若count(*)>0,則執行UPDATE操作。
2.2、若count(*)=0,則執行INSERT操作。

1、先插入記錄。
2.1、若報ORA-001主鍵錯誤,則存在記錄,此時執行UPDATE操作。
2.2、若無報錯,認為插入完成。

以上兩種方法,我認為都可以實現這種業務邏輯,區別在於第二種方法可能只需要一次SQL操作,前提是大部分記錄都不存在,如果大部分操作都是UPDATE操作,可以這麼改:
1、先更新。
2.1、若更新條數>0,則存在記錄,執行完成。
2.2、若更新條數=0,則不存在記錄,執行INSERT操作。

以上邏輯最差的情況就是需要執行兩次SQL,如果資料量不大,則可以忽略消耗時間,但如果是大表,可能消耗就會翻倍。針對這種情況,或許可以考慮使用merge。

merge可以用於單條資料的處理,也可以用於資料的批處理。而且效率要比單獨執行update+insert 操作效率要高。

1.merge into的語法結構

MERGE [ INTO ] [ schema. ] table [ alias ]
USING { [ schema. ] table | views | query} [ alias ]
ON {condition}
WHEN MATCHED THEN
  UPDATE SET
{clause} WHEN NOT MATCHED THEN INSERT VALUES {clause}

MERGE INTO 是Oracle 9i以後才出現的新的功能。那這個功能 是什麼呢?
簡單來說,就是:“有則更新,無則插入”從這句話裡,應該可以理解到,merge into 操作一個物件’A’的時候,要有另外一個結果集做為源資料 ‘B’.‘merge into’ 將B中的資料與A中的資料按照一定條件’C’進行對比,如果 A中資料滿足C條件,則進行update操作,如果不滿足條件 ‘C’,則進行insert操作。

2.案例操作

2.1單表操作

建立使用者的時候,需要判斷使用者是否存在,如果存在則更新某些欄位的值,否則insert。

建立table

create table USERINFO
(
  u_id       NUMBER(20) not null,
  u_name     VARCHAR2(80),
  u_email    VARCHAR2(40),
  updatetime DATE,
  addtime    DATE
);
alter table USERINFO
  add constraint PRIMARY_U_ID primary key (U_ID)
  using index 
  tablespace XINGHUO
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

建立序列

-- Create sequence 
create sequence SEQ_USERINFO
minvalue 1
maxvalue 99999999999999999
start with 1
increment by 1
cache 20;

merge into 操作

merge into userinfo u
using (select 4 u_id, 'ykp' u_name, '[email protected]' u_email from dual) t
on (u.u_id = t.u_id and u.u_name = t.u_name)
when matched then
  update set u.updatetime = sysdate
when not matched then
  insert
    (u_id, u_name, u_email,addtime)
  values
    (seq_userinfo.nextval, t.u_name, t.u_email,sysdate);

注意,using語句中的結果集 B不可以與merge into 的物件A相同,否則,會因為結果集A,B恆等。當 on() 進行等值判斷時,只可以進行update操作,不能進行insert 操作,當 on() 進行不等值判斷時,只可以進行insert操作,不能進行update操作。

--這個案例是一個錯誤案例展示,永遠都不會進行insert操作,只會進行update操作,如果u_id=3的使用者不存在時,結果集A和B都是空,二者還是匹配的,此時結果集A和B還是matched的,此時的update操作只不過是沒有修改任何記錄而已
merge into userinfo u
using (select * from userinfo u2 where u2.u_id = 3) t
on (u.u_id = t.u_id and u.u_name = t.u_name)
when matched then
  update set u.updatetime = sysdate
when not matched then
  insert
    (u_id, u_name, u_email, addtime)
  values
    (seq_userinfo.nextval, 'ykp', '[email protected]', sysdate);

2.2多表操作

多表操作也會存在的,在insert的時候如果滿足某個條件,則進行更新,如果不滿足則進行insert

建立table

-- Create table
create table ORDER_INFO
(
  o_id       NUMBER(20) not null,
  o_name     VARCHAR2(100),
  o_u_id     NUMBER(20),
  o_desc     VARCHAR2(100),
  addtime    DATE,
  updatetime DATE
);
alter table ORDER_INFO
  add constraint PRIMARY_O_ID primary key (O_ID)
  using index 
  tablespace XINGHUO
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

建立sequence

create sequence SEQ_ORDERINFO
minvalue 1
maxvalue 99999999999999999
start with 1
increment by 1
cache 20;

merge into 操作

--多表操作
merge into order_info o
using (select * from userinfo u where u.u_name = 'ykp') t
on (o.o_u_id = t.u_id)
when matched then
  update set o.updatetime = sysdate
when not matched then
  insert
    (o.o_id, o.o_name, o.o_u_id, o.addtime)
  values
    (seq_orderinfo.nextval, t.u_name, t.u_id, sysdate);
select * from order_info;

相關推薦

oracle的merge into操作

merge into的使用場景 一段業務邏輯,需要先判斷一條記錄在資料庫中是否有存在,若存在則更新該記錄,若不存在則插入記錄。 應用之前的做法是: 1、先用條件判斷記錄在資料庫中的個數。 2.1、若count(*)>0,則執行UPDATE操作。

MongoDB增刪改查操作

添加多個 負數 指定 cal lib 定位 也會 pan str 一、插入 MongoDB的插入操作很簡單,使用insert方法,這裏演示從創建數據庫、創建集合到插入文檔、查詢文檔。 集合創建方法參數說明: size:集合最大空間 max:集合最多文檔數量 (超出si

Git遠程操作

命令使用 eight conf 分支 master 選項 pull pru ase 一、git clone git clone <版本庫網站> git clone https://github.com/jquery/jquery.git 克隆jQuery的版

【轉】 C語言文件操作

pri void rfi 識別 archive format 隨機 stat 文本文 轉自:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551780.html C語言中沒有輸入輸出語句,所有的輸入輸出功能都用

JMeter數據庫操作

idt .cn username logs word api family -1 用戶名 Jmeter提供了JDBC連接的插件,通過執行SQL語句的java API,實現對數據庫的訪問和查詢。 一、安裝驅動包   將需要連接JDBC的jar包放入jmeter安裝文件的lib

DNS基本概念及操作----------------轉載

dns介紹 DNS基本概念及操作詳解目錄:1.DNS協議2.DNS查詢 2.1遞歸查詢 2.2跌代查詢 2.3反向查詢3.域維護 3.1全量AXFR傳輸 3.2增量IXFR傳輸 3.3通過NOTIFY 3.4動態更新4.DNS安全 在很多人看來,DNS只是為外部提供DNS解析服務(我以前也是這麽認為

(轉載)Resize Instance 操作

可能 compute api 消息 confirm 詳細分析 tin 相同 .cn (轉載)Resize Instance 操作詳解 - 每天5分鐘玩轉 OpenStack(41) 原文路徑:https://www.cnblogs.com/CloudMan6/p/55482

VB ListView控件各種操作

auto .com 設置 查看 右鍵 src 行為 ade 在線 VB ListView控件各種操作詳解 [vb] view plaincopy Private Sub Form_Load() ‘ListView1.SmallIcon

SQL Server2008及以上 表分區操作

value 詳細 分享 指令 pos 分割 分區方案 別了 分區   1. 創建分區函數   2. 創建分區方案   3. 對表進行分區   下面將對每個步驟進行詳細介紹。   步驟一:創建一個分區函數   此分區函數用於定義你希望SQL Server如何對數據進行分

Git遠程操作(新手必備)

tar etc rename 也有 mas 本地文件 轉載 其中 efault Git是目前最流行的版本管理系統,學會Git幾乎成了開發者的必備技能。 Git有很多優勢,其中之一就是遠程操作非常簡便。本文詳細介紹5個Git命令,它們的概念和用法,理解了這些內容,你就會完全掌

C語言學習系列——文件讀寫操作

記錄 源程序 8.4 lib 令行 stdio.h 空串 表示 參數 當文件按指定的工作方式打開以後,就可以執行對文件的讀和寫。下面按文件的性質分類進行操作。針對文本文件和二進制文件的不同性質,對文本文件來說,可按字符讀寫或按字符串讀寫;對二進制文件來說,可進行

linux零基礎學習之Linux sed 命令常用操作

延伸 進行 數據 12px -i 空白 字符串 options 信息 sed是Linux系統中一個很好的文件處理工具,可以對數據進行替換、刪除、新增以及選取等操作,使用起來也十分方面,以下是全面的sed操作介紹。sed命令行格式:sed [options] 'com

二叉搜索樹的刪除操作(BST)

子節點 沒有 解釋 找到 bst 左右 直接 元素 改變 一、思想:分類討論 二、二叉搜索樹的刪除操作具體討論分如下四種情況:(記我們要刪除的節點為D) 1、如果D節點既沒有左孩子,也沒有右孩子,那麽直接刪除就好了; 2、如果D節點只有左孩子,沒有右孩子,那麽只

Java 常用IO流操作

字符集 -s fileinput 顯式 print OS 數值 重寫 目錄 1.基本概念 IO:Java對數據的操作是通過流的方式,IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java用於操作流的對象都在IO包中。 2.IO流的分類 圖示:(主要IO流)

python 字典操作

python字典操作 字典一種key – value 的數據類型,使用就像我們上學用的字典,通過筆劃、字母來查對應頁的詳細內容。 語法: info ={ ‘stu1001‘:"TengLan Wu", ‘Stu1002‘:"Longze Loula", ‘stu1103‘:"XiaoZ

C# 字符串操作

字符串操作 .get pan class line IV alt har 串操作 1、字符串轉字符數組 (1)、ToCharArray()方法,源碼如下: 調用代碼: var str = "Hello World"; //將字符串轉換成字符數組 var result =

無鎖的同步策略——CAS操作

更新 src 使用 cst 線程互斥 地方 int jdk 它的 1. 從樂觀鎖和悲觀鎖談起 樂觀鎖和悲觀鎖是兩種不同的解決並發問題的策略。悲觀鎖策略假定任何一次並發都會發生沖突,所以總是采用最嚴格的方式來進行並發控制。java中的獨占鎖(synchronized和重入鎖)

tensorflow 卷積/反卷積-池化/反池化操作

sha ted href ref 操作 int inpu ase 反卷積 Plese see this answer for a detailed example of how tf.nn.conv2d_backprop_input and tf.nn.conv2d_b

【Python爬蟲學習筆記8-2】MongoDB數據庫操作

參考資料 adding ocl 切換 username 詳解 top .com min 上一篇學習筆記8-1中介紹了MySQL和MongoDB的安裝、啟動和配置,本節我們接著學習有關MongoDB的一些概念、基本操作和在python中的使用。 MongoDB常用概念 為更好

Python-OpenCV —— 基本操作

ext output bottom 水平 邊框 bsd efault fps itl OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、MacOS操作系統上。它輕量級而且高效——由一系列 C 函數和少量C++類構成,同時