详情

首页手游攻略 Oracle、Mysql数据库中的insertOrUpdateBatch做法(数据存在则更新,不存在则插入方法)实用指南

Oracle、Mysql数据库中的insertOrUpdateBatch做法(数据存在则更新,不存在则插入方法)实用指南

佚名 2026-10-24 14:30:01

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Oracle、Mysql数据库中的insertOrUpdateBatch……”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

实际处理时,Oracle 数据库 和 Mysql 数据库 中的SQL 存在不同的方言,在写SQL时需留意区分

1. Orecal 数据库

Orecal 数据库的 insertOrUpdateBatch 是用 mege into 类实现的

// merge into 语法  当数据存在时 更新数据, 不能更新 指定主键字段 (判断数据是否存在的字段)

merge into QWPH_XN.SYS_AREA t1
using (select 'lkz001' as ID,'KD001' as P_ID from dual) t2
on ( t1.ID = t2.ID and t1.P_ID = t2.P_ID)
when matched then
    update
    set t1.AREA_NAME = 'lkz0016666666666666666666'
when not matched then
    insert (ID,P_ID)
    values ('lkz002','KD001' );

    
// **** dual是一张临时表,也可以自己构建,例如:

 merge into QWPH_XN.SYS_AREA t1
using DUAL
on ( t1.ID= 'lkz003')
when matched then
    update
    set t1.AREA_NAME = 'KEDONG'
when not matched then
    insert (ID,P_ID)
    values ('lkz003','KD003' );


<!--   根据指定 字段 进行更新, 不能更新关联条件中的 字段
       如果 更新字段 被 改动了,那就是 插入
-->
   
 <insert id="insertOrUpdateBatch">
            <foreach collection="collectList" item="entity" separator=";">
                merge into ${model}.SYS_AREA t1 using dual on (t1.ID = #{entity.id} and t1.P_ID = #{entity.pId})
                when matched then
                update
                <set>
                    <if test="entity.areaName != '' and entity.areaName != null ">
                        AREA_NAME = #{entity.areaName},
                    </if>

                    <if test="entity.dtype != '' and entity.dtype != null ">
                        DTYPE = #{entity.dtype},
                    </if>

                    <if test="entity.level != '' and entity.level != null ">
                        LEVEL = #{entity.level},
                    </if>

                    <if test="entity.datasourceId != '' and entity.datasourceId != null ">
                        DATASOURCE_ID = #{entity.datasourceId},
                    </if>

                </set>

                when not matched then
                insert (ID, AREA_NAME, P_ID, DTYPE, "LEVEL", DATASOURCE_ID)
                values (#{entity.id}, #{entity.areaName},#{entity.pId},
                #{entity.level},#{entity.dtype},#{entity.datasourceId})

            </foreach>

    </insert>

2. Mysql 数据库

Orecal 数据库 和 Mysql 数据库的 插入或更新 sql 语句 不一样

<!--
insert into on duplicate key update表示插入更新数据,
当记录中有PrimaryKey,或者unique索引的话,
如果数据库已经存在数据,则用新数据更新(update),
如果没有数据效果则和insert into一样。
-->

<insert id="insertOrUpdateBatch"keyProperty="uuid"useGeneratedKeys="true">

inSert intO TASK LOG(TASK_ID, TASK_NAME, EXEC TYPE, STATUS, EXEC_TIME, EXCEPTION_MESSAGE)
values
<foreach collection="entities" item="entity" separator=" ">
(#lentity,taskId}, #entity.taskName}, #lentity.execType}, #ientity,status}, #entity.execTime}, #lentity.exceptionMessage})
</foreach>
on duplicate key update
TASK ID = ValUeS(TASK ID)
TASK NAME = VLUeS(TASK NAME)
EXEC TYPE = ValUeS(EXEC_TYPE)
STATUS = valveS(STATUS).
EXEC TIME = VlveS(EXEC TIME)
EXCEPTION_MESSAGE = VaLUeS(EXCEPTION_MESSAGE)

</insert>

总结

理解这一步时,总的来说,oracle mysql适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

相关资讯
点击查看更多
游戏推荐
推荐专题
热门阅读
推荐下载