Oracle 批量插入解决主键冲突方案
代码案例
MERGE INTO table_a t
USING (
SELECT 值1 别名1, 值2 别名2, 值3 别名3 FROM DUAL
UNION ALL
SELECT 值1 别名1, 值2 别名2, 值3 别名3 FROM DUAL ) t1
ON ( t.列1 = t1.别名1 AND t.列2= t1.别名2 )
WHEN MATCHED THEN
UPDATE
SET t.列1= t1.别名1,
t.列2 = t1.别名2,
t.列3 = t1.别名3
WHEN NOT MATCHED THEN
INSERT ( 列1, 列2, 列3 )
VALUES
(
t1.别名1,
t1.别名2,
t1.别名3
)
实际案例#
<insert id="save" parameterType="****Qs.***">
merge into S***E t
<!-- insert 和update中所有的数据都需要从using中获取 -->
using(
<!-- item:list中的具体对象 -->
<foreach collection="qs**.lines" item="item" open="" close="" separator="union">
select
#{item.HeaderId} Hid, #{item.LineId} Lid, #{item.s**r} Sn,
#{item.i***e} En, #{item.i**e} Zn, #{item.n***r} Nn,
#{item.u**t} Uc, #{item.c***s} Cd, #{item.p**ow} Vl,
#{item.p**h} Vh, #{q**q.l***e} Lud, #{q***q.l***y} Lub,
#{q**q.c**e} Da, #{q***q.c***y} Ba
from DUAL
</foreach>
) tmp
<!-- on后面的括弧不能省 -->
on ( t.Q***D = tmp.Lid)
when matched THEN
update set
<!-- ORA-38104: 在on条件中的列是不可以更新的 t.ID = tmp.ID -->
t.Q***D = tmp.Hid,t.S***R = tmp.Sn
,t.I***E = tmp.En,t.I***E = tmp.Zn,t.NA***R = tmp.Nn
,t.U***NT = tmp.Uc,t.C***S = tmp.Cd,t.PR***W = tmp.Vl
,t.P***H = tmp.Vh,t.L***E = tmp.Lud,t.L***Y = tmp.Lub
,t.C***E=tmp.Da,t.C***Y=tmp.Ba
when not matched THEN
insert
<trim prefix="(" suffix=")" suffixOverrides=",">
t.Q***D, t.Q***D, t.S***R,
t.I***E, t.I***E, t.N***R,U***T, t.C***S, t.P***W,
t.P**H, t.L***E, t.L***Y, t.C***E, t.C***Y
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
tmp.Hid, tmp.Lid, tmp.Sn,
tmp.En, tmp.Zn, tmp.Nn,tmp.Uc, tmp.Cd, tmp.Vl,
tmp.Vh, tmp.Lud, tmp.Lub, tmp.Da, tmp.Ba
</trim>
</insert>
作者:Cn_FallTime
出处:https://www.cnblogs.com/CnFallTime/p/16381420.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端