在程序中新增数据为了防止重复,经常就是先判断是否存在,存在就更新否则插入。在一个大批量插入的时候,那么就要执行很多次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这个方法,但很明显,相当是更新时引用插入的时候的这个值