MySql几十万条数据,同时新增或者修改

15 篇文章 0 订阅
8 篇文章 0 订阅

项目场景:

十万条甚至更多的数据新增或者修改


问题描述

现在有十万条数据甚至更多数据,这些数据中有的需要更新,有的需要插入,在库中存在的数据需要更新,不存在的数据则新增。


原因分析:

几十万的数据有新增,有修改,我们肯定不能在代码中写循环,每一条数据都去数据库中去查询匹配一次,要是数十万条数据那就是查数十万次数据库,这样显然是不可能的,数据库也扛不住


解决方案:

提示:有两种解决方案简单记录下,在mybatis中使用的场景

1、第一种解决方式,使用on duplicate key update,主键重复去修改,不重复就新增,这里的order_id就是主键

<insert id="addOrUpdateKryOrderMst" parameterType="list">
        insert into ${schema}.xxx表
        (`order_id`,
         `trade_no`,
         `trade_type`,
         `trade_status`,
         `order_time`,
         `check_out_time`,
         `source`,
         `source_name`,
         `received_amount`,
         `cust_real_pay`,
         `trade_amount`,
         `privilege_amount`)
        values
        <foreach collection="OrderParam" item="item" separator=",">
            (#{item.orderId}, #{item.tradeNo}, #{item.tradeType}, #{item.tradeStatus}, #{item.orderTime}, #{item.checkOutTime}, #{item.source}, #{item.sourceName}, #{item.receivedAmount}, #{item.custRealPay}, #{item.tradeAmount}, #{item.privilegeAmount})
        </foreach>
        on duplicate key update
                         trade_no = values (trade_no), 
                         trade_type = values (trade_type), 
                         trade_status = values (trade_status), 
                         order_time = values (order_time), 
                         check_out_time = values (check_out_time), 
                         `source` = values (`source`), 
                         source_name = values (source_name), 
                         received_amount = values (received_amount), 
                         cust_real_pay = values (cust_real_pay), 
                         trade_amount = values (trade_amount), 
                         privilege_amount = values (trade_amount)
    </insert>

2、第二种解决方式,使用replace into,若主键存在,则删除这一条数据,并且新增一条

    <insert id="addOrUpdateKryOrderMst" parameterType="list">
        replace into ${schema}.me_kry_order_mst
        (`order_id`,
         `trade_no`,
         `trade_type`,
         `trade_status`,
         `order_time`,
         `check_out_time`,
         `source`,
         `source_name`,
         `received_amount`,
         `cust_real_pay`,
         `trade_amount`,
         `privilege_amount`)
        values
        <foreach collection="kryOrderMstParam" item="item" separator=",">
            (#{item.orderId}, #{item.tradeNo}, #{item.tradeType}, #{item.tradeStatus}, #{item.orderTime}, #{item.checkOutTime}, #{item.source}, #{item.sourceName}, #{item.receivedAmount}, #{item.custRealPay}, #{item.tradeAmount}, #{item.privilegeAmount})
        </foreach>
    </insert>

写的不好,请各位看官多多担待,勿喷谢谢,有需要补充请留言!

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值