MySQL ON DUPLICATE KEY UPDATE 語法


一、前言

   在日常業務開發中經常有這樣一個場景,首先創建一條記錄,然后插入到數據庫,如果數據庫已經存在同一主鍵的記錄,執行update操作;否則,執行insert操作。這個操作可以在業務層做,也可以在數據庫層面做。業務層一般做法是先查詢,如果不存在就插入,如果存在就更新;但是查詢和插入不是原子性操作,在並發量比較高的時候,可能兩個線程都查詢不到某個記錄,所以會執行兩次插入,其中一條必然會因為唯一性約束沖突而失敗。數據庫層mysql中INSERT ... ON DUPLICATE KEY UPDATE就可以做這個事情,並且是原子性操作,感覺實在是太方便了,本文就來講解它的使用技巧。
 

二、INSERT ... ON DUPLICATE KEY UPDATE命令

2.1 單條記錄下使用

INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

  如上sql假如t1表的主鍵或者UNIQUE 索引是a,那么當執行sql的時候,如果數據庫里面已經存在a=1的記錄則更新這條記錄的c字段的值為原來值+1,然后返回值為2;如果不存在則插入記錄a=1,b=2,c=3,然后返回值為1。如果insert語句中同時出現UNIQUE索引和PRIMARY KEY,則以后者為准。ON DUPLICATE KEY UPDATE后面可以放多個字段,用英文逗號分割。

2.2 多記錄下使用 

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c), b=VALUES(b);

 

三、MyBatis下使用

  Mybatis作為經典的數據庫持久層框架,自然要介紹下它下的使用。假設t1表的主鍵是a。 在mapper.xml里面批量操作配置如下:
<insert id="insertOrUpdateBatch">
        INSERT INTO t1 (a,b,c) values
        <foreach collection="list" item="item"  separator=","> (#{item.a},#{item.b},#{item.c}) </foreach>
        ON DUPLICATE KEY UPDATE c=values(c),b=values(b) </insert>

  對應的mapper接口可以定義為:

long insertOrUpdateBatch(List<Test> list);

  實體類定義

class Test{ private int a; private int b; private int c; // omit getter, setter and toString }

 

Reference 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM