一、存在时则忽略
为什么在发现重复时会忽略?这里面涉及到两个地方。
1、重复则忽略。那么首先是需要判断是否重复,这里是通过唯一索引判断是否重复的。如果表中唯一索引的字段已经存在与将要插入的记录行中唯一索引的字段值相同,则标识为重复。
MySQL 中建立唯一索引:ALTER TABLE ‘tableName’ ADD UNIQUE (‘column’);
如下面的代码块中的 ght_replace 表的 oldnumber 字段建立唯一索引:
ALTER TABLE ght_replace ADD UNIQUE (oldnumber);
2、通过在SQL语句中的 IGNORE 关键字标识,如果相同,则该条记录行不插入。
如下面的代码块中所示:
@Insert({"<script>","insert ignore into ght_replace(oldnumber, newnumber)","values","<foreach item ='item' collection = 'andOldVoList' separator = ','>","(#{item.oldnumber}, #{item.newnumber})","</foreach>","ON DUPLICATE KEY UPDATE oldnumber = VALUES(oldnumber)","</script>"})int batchInsert(@Param("andOldVoList")List<NewAndOldVo> andOldVoList);
二、存在时则更新
@Insert({"<script>","insert into telit_project_relation(project_name, inside_project_number)","values","<foreach item ='dataInfo' collection = 'projectRelationEntities' separator = ','>","(#{dataInfo.projectName}, #{dataInfo.insideProjectNumber})","</foreach>","ON DUPLICATE KEY UPDATE project_name = VALUES(project_name)","</script>"})int batchInsert(@Param("projectRelationEntities")List<TelitProjectRelationEntity> projectRelationEntities);
存在时则更新代码如上所示。存在则更新的关键在 "
ON DUPLICATE KEY UPDATE project_name = VALUES(project_name)
是数据库中列名,不是 entity 中的属性名
三、存在复合唯一索引时,批量插入,如果存在则更新
在使用符合唯一索引时也是一样的,首先需要的是唯一索引:
ALTER TABLE asus_bom_relationship ADD UNIQUE INDEX(byd_material_no, bydComponent);
/*** 批量插入功能** @param entityList* @return*/@Insert({"<script>","insert into asus_bom_relationship(material_no, byd_material_no, bom_component, bydComponent)","values","<foreach item ='dataInfo' collection = 'entityList' separator = ','>","(#{dataInfo.materialNo}, #{dataInfo.bydMaterialNo}, #{dataInfo.bomComponent}, #{dataInfo.bydComponent})","</foreach>","ON DUPLICATE KEY UPDATE byd_material_no = VALUES(byd_material_no), bydComponent = VALUES(bydComponent)","</script>"})int batchInsert(@Param("entityList") List<RelationShipEntity> entityList);