oracle批量插入,存在則更新,不存在則插入
INSERT … ON DUPLICATE KEY UPDATE … 語句
在併發量比較高的時候,可能兩個執行緒都查詢某個記錄不存在,所以會執行兩次插入,然後其中一條必然會因為主鍵(這裡說的主鍵不是遞增主鍵)衝突而失敗。
資料庫層MySQL中INSERT … ON DUPLICATE KEY UPDATE … 就可以做這個事情,並且是原子性操作。
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。
2、多條記錄下使用:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(c);
MERGE INTO...語句
T有a、b兩個欄位 a是主鍵。現在有記錄(100, 2)要儲存到T中,T中如果已經存在則更新欄位b,沒有插入。
MERGE INTO T T1
USING (SELECT '100' AS a, 2 AS b FROM dual) T2
ON ( T1.a = T2.a)
WHEN MATCHED THEN
UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN
INSERT (a, b) VALUES(T2.a, T2.b);
MyBatis下使用
Mybatis作為經典的資料庫持久層框架,自然要介紹下它下的使用
在mapper.xml裡面配置如下:
假設a為主鍵
<insert id="insertOrUpdate">
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 insertOrUpdate(List<Test> list);
class Test{
private int a;
private int b;
private int c;
...
}
————————————————
版權宣告:本文為CSDN博主「Rnan-prince」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_19446965/article/details/120735141