- 需求,对于表中数据进行插入/批量更新,目前的情况是,表中可能会存在主键冲突的情况,此刻,可以使用MySQL中特有的一个语法:ON DUPLICATE KEY UPDATE,可以自动判断是进行插入还是进行更新操作
注意:ON DUPLICATE KEY UPDATE,得到的结果是正常插入的2倍,也就是insert,返回的10,那么使用了这个,如果是更新操作,那么结果就是20
INSERT INTO staff (ID, NAME, SEX)
VALUES (1, 'tom', 'Male'),
(2, 'summy', 'FaMale')
ON DUPLICATE KEY UPDATE ID = VALUES(ID),
NAME=VALUES(NAME),
SEX=VALUES(SEX);
实例:
<insert id="batchInsert" parameterType="map">
<!--@mbg.generated-->
insert into grd_que
(CUST_ID, BOOK_ID, QUE_SEQ_ID, QB_ID, ROTATE_CNT, GO_CROSS, ANS_RESULT, START_TIME,
SPEND_TIME,TURN_DIR)
values
<foreach collection="list" item="item" separator=",">
(#{item.custId,jdbcType=VARCHAR}, #{item.bookId,jdbcType=CHAR}, #{item.queSeqId,jdbcType=CHAR},
#{item.qbId,jdbcType=VARCHAR}, #{item.rotateCnt,jdbcType=BOOLEAN}, #{item.goCross,jdbcType=VARCHAR},
#{item.ansResult,jdbcType=CHAR}, #{item.startTime,jdbcType=CHAR}, #{item.spendTime,jdbcType=SMALLINT},
#{item.turnDir}
)
</foreach>
ON DUPLICATE KEY UPDATE
CUST_ID=values(CUST_ID),
BOOK_ID=values(BOOK_ID),
QUE_SEQ_ID=values(QUE_SEQ_ID),
QB_ID=values(QB_ID),
ROTATE_CNT=values(ROTATE_CNT),
GO_CROSS=values(QUE_SEQ_ID),
ANS_RESULT=values(QUE_SEQ_ID),
START_TIME=values(QUE_SEQ_ID),
SPEND_TIME=values(QUE_SEQ_ID),
TURN_DIR=values(QUE_SEQ_ID)
</insert>