mysql批量更新,多条记录更新为不同的值的写法

291 阅读1分钟

第一种写法:一条记录update一次,性能比较差,容易造成阻塞。

<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update course
        <set>
            name=${item.name},
            title=${item.title},
        </set>
        where id = ${item.id}
    </foreach>      
</update>

第二种mybatis写法,foreach + case when

<update id="updateBatch" parameterType="list">
            update course
            <trim prefix="set" suffixOverrides=",">
             <trim prefix="name =case" suffix="end,">
                 <foreach collection="list" item="item" index="index">
                         when id=#{item.id} then #{item.name}
                 </foreach>
              </trim>
              <trim prefix="title =case" suffix="end,">
                 <foreach collection="list" item="item" index="index">
                         when id=#{item.id} then #{item.title}
                 </foreach>
              </trim>
             </trim>
            where
			id IN
            <foreach collection="list" item="item" index="index" separator="," open="(" close=")>
              #{item.id}
          </foreach>
</update>

-- 转换为sql:

UPDATE course
    SET name = CASE id 
        WHEN 1 THEN 'name1'
        WHEN 2 THEN 'name2'
        WHEN 3 THEN 'name3'
    END, 
    title = CASE id 
        WHEN 1 THEN 'New Title 1'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

第三种写法:使用临时表联表更新

<update id="updateBatch">
	update course,
	(
	<foreach item="item" collection="list" separator=" UNION ALL ">
		select #{item.id} as id, #{item.name} as name, #{item.title} as title
	</foreach>
	) temp_course
	set 
            course.name = temp_course.name,
            course.title = temp_course.title
	where course.id = temp_course.id
</update>

-- 转为sql :

update
	wms_use_stock course,
	(
	 select
            1 as id,
            'name_1' as name ,
            'title_1' as title 
	 UNION ALL 
	 select
            2 as id,
            'name_2' as name ,
            'title_2' as title  
	) temp_course
set
	course.name = temp_course.name,
	course.title = temp_course.title
where course.id = temp_course.id