Oracle merge合并更新函数实例详解
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,前言MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,
千家信息网最后更新 2026年11月01日Oracle merge合并更新函数实例详解
前言
MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。通过这个MERGE你能够在一个SQL语句中对一个表同时执行INSERT和UPDATE操作.
本博客介绍一下Oracle merge合并函数,业务场景:新增数据的时候要先查询数据库是否已经有改数据,有数据就更新数据,没数据才新增数据,这是很常见的业务场景,如果是用Oracle数据库的话,其实直接用merge函数效率更快,而且merge函数性能也相对比较好
merge函数的语法:
MERGE INTO table_name alias1 USING (table|view|sub_query) alias2ON (join condition) WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1, col2 = col_val2 WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);
举个例子:
SQL实现,意思是有数据就更新,没数据才新增
MERGE INTO t_config_related A1 USING(select '97547758-6f85-419e-85f9-b8f711ca2660' seq, '97547758-6f85-419e-85f9-b8f711ca2658' tipsSeq, to_number('1') appLevel, '24e1ccc38d9542189d1cc6c23f814a18' relaSeq from dual) A2ON(A1.seq = A2.seq)WHEN MATCHED THENUPDATE SET A1.tips_seq = A2.tipsSeq, A1.app_level = A2.appLevel, A1.rela_seq = A2.relaSeqWHEN NOT MATCHED THENINSERT(seq , tips_seq , app_level , rela_seq)VALUES(A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq);/** * 批量更新保存地区关联信息 * @date 2019年2月21日上午11:17:10 * @return */ @RequestMapping("/batchSaveTipsAreaConfig") @ResponseBody public ResultModel batchSaveTipsConfig(ApprTipsRelatedModel relatedModel) { List areaTipsList = new ArrayList(); //封装批量更新的地区列表 String[] areaSeqs = StringUtils.split(relatedModel.getAreaSeq(),","); for (String areaSeq : areaSeqs) { ApprTipsRelatedModel areaRelatedModelNew = new ApprTipsRelatedModel(); areaRelatedModelNew.setSeq(commonService.generateUUID()); areaRelatedModelNew.setTipsSeq(relatedModel.getTipsSeq()); areaRelatedModelNew.setAppLevel(NumConstant.COMMON_NUM_TREE); areaRelatedModelNew.setRelaSeq(areaSeq); areaTipsList.add(areaRelatedModelNew); } //批量更新新增数据 try { this.tipsConfigService.batchSaveTipsRelatedConfig(areaTipsList); return ResultModel.success("保存成功"); } catch(Exception e) { logger.error("批量绑定地区异常:{}"+e); throw new SuperControllerException(); } } 注意要点:
在开发中我遇到一个异常,mybatis打印出来的SQL是这样的:
Preparing: MERGE INTO appr_tips_config_related A1 ? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ? WHEN MATCHED THEN ? ? UPDATE SET A1.seq = A2.seq, A1.tips_seq = A2.tipsSeq, A1.app_level = A2.appLevel, A1.rela_seq = A2.relaSeq ? ? ?WHEN NOT MATCHED THEN ? ? ?INSERT(seq,tip_seq,app_level,rela_seq) ? ? ? ? VALUES(A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq)
可以看出什么问题?打印出的SQL有很多问号,那是因为SQL有空格导致的,所以使用merge函数不用随便加空格,不然会报错的
? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ?
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
数据
函数
更新
语句
地区
语法
查询
业务
内容
场景
效率
数据库
条件
学习
工作
成功
不用
价值
例子
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡豆
有格互联网科技
广州紫鲸互联网科技有限公司
重庆互联网络科技
互联网 的科技创新
广州凡科互联网科技
润盈互联网科技
天下捷融互联网科技
中正互联网科技招聘
互联网 科技馆
中盈科技互联网信息有限公司
燊美集互联网科技有限公司
中科明德北京互联网科技
梅州GM互联网络科技有限公司
互联网科技数字货币
半导体行业属于互联网高科技类吗
珠海东科互联网科技有限公司
现代互联网科技公司
中国主要互联网科技公司
山东亿川互联网科技有限责任公司
喔噻互联网科技有限公司
金融科技还是互联网
互联网科技论文
美国互联网黑科技
科技互联网的估值
互联网时代科技改变生活
宁夏科技产业互联网案例
互联网科技公司实习生
知域互联网科技有限公司大骗子
互联网与数字科技关系