在批量插入数据时使用关键字 IGNORE_ROW_ON_DUPKEY_INDEX 可实现忽略唯一约束冲突,回滚当前行,继续完成其他行的插入。
-
创建(联合)唯一索引
ALTER TABLE table_name ADD CONSTRAINT unique_index_name UNIQUE (column1, column2,…);
-
在mybatis xml文件中使用
以逗号分隔的唯一索引中的列名
/*+ IGNORE_ROW_ON_DUPKEY_INDEX(table_name(column_name1, column_name2,...)) */
<insert id="insertBatchIgnoreRepeat" parameterType="java.util.List" useGeneratedKeys="false">
INSERT <![CDATA[ /*+ IGNORE_ROW_ON_DUPKEY_INDEX(FMB_EQP_STATUS_HIS(EQP_NAME,EQP_STATUS,TXN_TIME,PREVIOUS_STATE,EVENT_NAME)) */ ]]> INTO FMB_EQP_STATUS_HIS
(ID, EQP_ID, EQP_NAME,EQP_STATUS,
TXN_TIME,STATE_END_TIME,PREVIOUS_STATE,PREVIOUS_STATE_TIME,
BRIEF_DESCRIPTION,DETAIL_DESCRIPTION,COMMENT_CODE,EVENT_NAME,
STATUS_DURATION, REMARKS,CREATE_DATE,
UPDATE_DATE, DEL_FLAG)
(
<foreach collection="eqpStatusHisList" item="eqpStatusHis" index="index" separator="UNION">
SELECT #{eqpStatusHis.id,jdbcType=VARCHAR},
#{eqpStatusHis.eqpId,jdbcType=VARCHAR},
#{eqpStatusHis.eqpName,jdbcType=VARCHAR},
#{eqpStatusHis.eqpStatus,jdbcType=VARCHAR},
#{eqpStatusHis.txnTime,jdbcType=VARCHAR},
#{eqpStatusHis.stateEndTime,jdbcType=VARCHAR},
#{eqpStatusHis.previousState,jdbcType=VARCHAR},
#{eqpStatusHis.previousStateTime,jdbcType=VARCHAR},
#{eqpStatusHis.briefDescription,jdbcType=VARCHAR},
#{eqpStatusHis.detailDescription,jdbcType=VARCHAR},
#{eqpStatusHis.commentCode,jdbcType=VARCHAR},
#{eqpStatusHis.eventName,jdbcType=VARCHAR},
#{eqpStatusHis.statusDuration,jdbcType=DECIMAL},
#{eqpStatusHis.remarks,jdbcType=VARCHAR},
#{eqpStatusHis.createDate,jdbcType=TIMESTAMP},
#{eqpStatusHis.updateDate,jdbcType=TIMESTAMP},
#{eqpStatusHis.delFlag,jdbcType=CHAR} FROM DUAL
</foreach>
)
</insert>