mysql中的批量更新

278 阅读1分钟
  1. 需求,对于表中数据进行插入/批量更新,目前的情况是,表中可能会存在主键冲突的情况,此刻,可以使用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>