SQL实现表中有则批量更新,没有则新增

文章详细介绍了SQL中的MERGEINTO语句,用于合并数据到目标表中。当目标表的记录与源表匹配时进行更新,不匹配则插入新记录。文中提供了一个简单的示例以及一个实际应用例子,展示了如何在G_ASSET_INVENTORY_ACT_E表中根据源数据执行更新或插入操作。此外,还提到了MySQL中类似功能的ONDUPLICATEKEYUPDATE语句。
摘要由CSDN通过智能技术生成

1、语法

merge into 的语法如下所示:

MERGE INTO [target-table] T
USING [source-table sql] S
ON([conditional expression] and […]…)
WHEN MATCHED THEN [UPDATE sql]
WHEN NOT MATCHED THEN [INSERT sql]

2、简单示例

merge into target t using source s on (t.id = s.aid)
when matched then
update set t.year = s.year
when not matched then
insert values(s.aid, s.name, s.year);
merge into target t

:指定目标表为target,并使用别名t。
using source s
:指定源数据集,其中包含要插入或更新的数据,并使用别名s。
on (t.id = s.aid)
:指定合并条件,当目标表的id与源数据集的aid相匹配时执行更新操作。
when matched then update set t.year = s.year
:指定当合并条件满足时执行更新操作。在这里,设置目标表的year列的值为源数据集中对应的year值。
when not matched then insert values(s.aid, s.name, s.year)
:指定当合并条件不满足时执行插入操作。在这里,将源数据集中的aid、name和year值插入到目标表中。

3、实际示例

MERGE INTO G_ASSET_INVENTORY_ACT_E AS target
USING (
    VALUES
<foreach collection="list" item="item" separator=",">
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="#{item.srcid} != null">#{item.srcid},</if>
        <if test="#{item.inventoryname} != null">#{item.inventoryname},</if>
        <if test="#{item.assettagno} != null">#{item.assettagno},</if>
    </trim>
</foreach>
) AS source (srcid,inventoryname,assettagno)
ON (target.srcid = source.srcid)
WHEN MATCHED THEN
    UPDATE SET
        target.srcid = source.srcid,
        target.inventoryname = source.inventoryname,
        target.assettagno = source.assettagno,
WHEN NOT MATCHED THEN
    INSERT (srcid,inventoryname,assettagno)
    VALUES (source.srcid,
        source.inventoryname,
        source.assettagno,
);

以下是对该代码的解释:
MERGE INTO G_ASSET_INVENTORY_ACT_E AS target
:指定目标表为G_ASSET_INVENTORY_ACT_E,并使用别名target。
USING (…) AS source (srcid,inventoryname,assettagno)
:指定源数据集,其中包含了要插入或更新的数据列(srcid、inventoryname、assettagno),并使用别名source。
ON (target.srcid = source.srcid)
:指定合并条件,当目标表的srcid与源数据集的srcid相匹配时执行更新操作。
WHEN MATCHED THEN UPDATE SET …
:指定当合并条件满足时执行更新操作。在这里,设置目标表的srcid、inventoryname和assettagno等列的值为源数据集中对应的值。
WHEN NOT MATCHED THEN INSERT …
:指定当合并条件不满足时执行插入操作。在这里,将源数据集中的srcid、inventoryname和assettagno等列的值插入到目标表中。

4、MySQL版本

使用ON DUPLICATE key update

insert into G_ASSET_INVENTORY_ACT_E
        (srcid,inventoryname,assettagno)
    values
    <foreach collection="list" item="item" separator=",">
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="#{item.srcid} != null">#{item.srcid},</if>
            <if test="#{item.inventoryname} != null">#{item.inventoryname},</if>
            <if test="#{item.assettagno} != null">#{item.assettagno},</if>
        </trim>
    </foreach>
     ON DUPLICATE KEY UPDATE
        srcid = VALUES(srcid),inventoryname = VALUES(inventoryname),assettagno = VALUES(assettagno),
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值