mysql之主键插入冲突就跟新(mybatis篇)

很多时候我们都会遇到插入数据导致主键冲突这种情况,我们就希望能更新这条记录而不会报错。在MySQL1.4以后就出现相对应的关键字来解决这个问题  on duplicate key update.

 当我们在插入数据库数据的时候,遇到唯一索引或者主键冲突就会根据主键进行更新指定的字段的数据,我们一般都是基于mybatis做数据库的操作,所以我们看下mybatis是如何写sql语句的:

对于单条的数据的插入更新:

insert into rights_customer_schedule (id, cid, audit_time, 
      activity_id, 
      uid, qualified_num,application_no)
    	values (#{id,jdbcType=INTEGER}, #{cid,jdbcType=VARCHAR}, #{auditTime,jdbcType=TIMESTAMP}, 
      #{activityId,jdbcType=VARCHAR}, 
      #{uid,jdbcType=VARCHAR}, #{qualifiedNum,jdbcType=INTEGER},#{applicationNo,jdbcType=VARCHAR})
      ON DUPLICATE KEY UPDATE qualified_num = #{qualifiedNum,jdbcType=INTEGER} 
      ,datachange_lasttime = NOW()

在测试的数据中cid和activity_id建立了联合唯一索引,如果数据库存在就会更新qualified_num和datachange_lasttime

这种是单条插入时候的写法,在看下批量导入的时候:

insert into rights_customer_schedule (id, cid, audit_time, 
      activity_id,
      uid, qualified_num,application_no)
		VALUES
		<foreach collection="list" item="item" index="index"
			separator=",">
			(
			#{item.id, jdbcType=INTEGER},
			#{item.cid, jdbcType=VARCHAR},
			#{item.auditTime,jdbcType=TIMESTAMP},
			#{item.activityId,jdbcType=VARCHAR},
			#{item.uid, jdbcType=VARCHAR},
			#{item.qualifiedNum, jdbcType=INTEGER},
			#{item.applicationNo, jdbcType=INTEGER}
			)
		</foreach>
		ON DUPLICATE KEY UPDATE
		qualified_num = VALUES(qualified_num)

和单条不同的是,批量需要用foreach进行构造,而on duplicate key update 后面的字段需要用values进行修饰参数是表的字段名称。

这里好像没有设置datachange_lasttime 字段的值,其实这个值在数据库的字段类型是:

ON UPDATE CURRENT_TIMESTAMP

所以不用设置当需要更修新数据的时候,这个字段就会更新

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值