mybatis mysql ON DUPLICATE KEY UPDATE批量新增重复时更新

mybatis | 2019-09-13 10:02:39

在程序中新增数据为了防止重复,经常就是先判断是否存在,存在就更新否则插入。在一个大批量插入的时候,那么就要执行很多次sql。这种模式下无法使用批量插入,无法进行优化,那么就只能使用mysql的ON DUPLICATE KEY UPDATE。
这个神器,就是存在唯一键就更新否则就插入,优化的效果不只一点点。

1.首先你得建唯一键unique index 可以是一个字段得唯一键,也可以是多个字段的。

ALTER IGNORE TABLE tableA ADD UNIQUE INDEX idx_col1_u (col1,col2); /*添加唯一索引,消重只保留前面的一条*/

如果有重复项在InnoDB不好使,我就是查出重复项的最后一条,然后删除的,一条sql搞定,这个简单。

2.mybatis的语法,当然你也可以不是用mybatis 怎么拼接sql道理都是一样。

<insert id="batchInsertUpdate" parameterType="MealAccount">
        INSERT INTO t_meal_account(user_id,user_name,weixinid,restaurant_id,department_id,gender,meal_date,meal_week,breakfast,breakfast_clock,lunch,lunch_clock,dinner,dinner_clock,clock_detail,clock_name,clock_code)  values
        <foreach collection="list" separator="," item="i">
                (#{i.userId},#{i.userName},#{i.weixinid},#{i.restaurantId},#{i.departmentId},#{i.gender},#{i.mealDate},#{i.mealWeek},#{i.breakfast},#{i.breakfastClock},#{i.lunch},#{i.lunchClock},#{i.dinner},#{i.dinnerClock},#{i.clockDetail},#{i.clockName},#{i.clockCode})
        </foreach>
        ON DUPLICATE KEY UPDATE user_id=values(user_id),user_name=values(user_name),weixinid=values(weixinid),restaurant_id=values(restaurant_id),department_id=values(department_id),gender=values(gender),meal_week=values(meal_week),breakfast=values(breakfast),breakfast_clock=values(breakfast_clock),lunch=values(lunch),lunch_clock=values(lunch_clock),dinner=values(dinner),dinner_clock=values(dinner_clock),clock_detail=values(clock_detail),clock_code=values(clock_code)
</insert>


我也第一次用values这个方法,但很明显,相当是更新时引用插入的时候的这个值




登录后即可回复 登录 | 注册
    
关注编程学问公众号