很多时候我们都会遇到插入数据导致主键冲突这种情况,我们就希望能更新这条记录而不会报错。在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
所以不用设置当需要更修新数据的时候,这个字段就会更新