ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

oracle批量插入,存在则更新,不存在则插入

2022-03-07 10:34:04  阅读:290  来源: 互联网

标签:INSERT 存在 INTO UPDATE 插入 DUPLICATE KEY 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

标签:INSERT,存在,INTO,UPDATE,插入,DUPLICATE,KEY,oracle,主键
来源: https://www.cnblogs.com/javalinux/p/15974771.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有