很多時候我們都會遇到插入數據導致主鍵衝突這種情況,我們就希望能更新這條記錄而不會報錯。在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
所以不用設置當需要更修新數據的時候,這個字段就會更新