批量更新_批量更新数据 - CSDN
精华内容
参与话题
  • mybatis 批量更新update详解 mysql

    千次阅读 2019-06-19 14:32:31
    mybatis 批量更新update详解 2018年07月31日 17:09:41 yjaspire 阅读数 3915 1 更新单条记录 UPDATE course SET name='course1'WHEREid='id1'; 2 更新多条记录的同一个字段为同一个值 UPDATEcourseSETname='...

    mybatis 批量更新update详解

    2018年07月31日 17:09:41 yjaspire 阅读数 3915

    1  更新单条记录 

    UPDATE course SET name = 'course1' WHEREid = 'id1';

    2  更新多条记录的同一个字段为同一个值

     UPDATE course SET name='course1' WHERE id in('id1','id2','id3);

    3  更新多条记录为多个字段为不同的值

    比较普通的写法,是通过循环,依次执行update语句。

    Mybatis写法如下: 

    
     
    1. <update id="updateBatch" parameterType="java.util.List">

    2. <foreach collection="list" item="item" index="index" open="" close="" separator=";">

    3. update course

    4. <set>

    5. name=${item.name}

    6. </set>

    7. where id = ${item.id}

    8. </foreach>

    9. </update>

    一条记录update一次,性能比较差,容易造成阻塞。

    MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。

    
     
    1. UPDATE course

    2. SET name = CASE id

    3. WHEN 1 THEN 'name1'

    4. WHEN 2 THEN 'name2'

    5. WHEN 3 THEN 'name3'

    6. END,

    7. title = CASE id

    8. WHEN 1 THEN 'New Title 1'

    9. WHEN 2 THEN 'New Title 2'

    10. WHEN 3 THEN 'New Title 3'

    11. END

    12. WHERE id IN (1,2,3)

    这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。

    在Mybatis中的配置则如下:

     <updateid="updateBatch"parameterType="list">

    
     
    1. update course

    2. <trim prefix="set" suffixOverrides=",">

    3. <trim prefix="name=case" suffix="end,">

    4. <foreach collection="list" item="item" index="index">

    5. <if test="item.name!=null">

    6. when id=#{item.id} then #{item.name}

    7. </if>

    8. </foreach>

    9. </trim>

    10. <trim prefix="title =case" suffix="end,">

    11. <foreach collection="list" item="item" index="index">

    12. <if test="item.title!=null">

    13. when id=#{item.id} then #{item.title}

    14. </if>

    15. </foreach>

    16. </trim>

    17. </trim>

    18. where

    19. <foreach collection="list" separator="or" item="item" index="index">

    20. id=#{item.id}

    21. </foreach>

    22. </update>

    <trim>属性说明 

    1.prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容 
    2.如果同时有prefixOverrides,suffixOverrides 表示会用prefix,suffix覆盖Overrides中的内容。 
    3.如果只有prefixOverrides,suffixOverrides 表示删除开头的或结尾的xxxOverides指定的内容。

    4  sql批量更新   

         看另外一个示例:

         <updateid="updateBatch"parameterType="java.util.List">

    
     
    1. update mydata_table

    2. set status=

    3. <foreach collection="list" item="item" index="index"

    4. separator=" " open="case ID" close="end">

    5. when #{item.id} then #{item.status}

    6. </foreach>

    7. where id in

    8. <foreach collection="list" index="index" item="item"

    9. separator="," open="(" close=")">

    10. #{item.id,jdbcType=BIGINT}

    11. </foreach>

    12. </update>

         其中when...then...是sql中的"switch" 语法。这里借助mybatis的<foreach>语法来拼凑成了批量更新的sql,上面的意思就是批量更新id在updateBatch参数所传递List中的数据的status字段。还可以使用<trim>实现同样的功能,代码如下:

    
     
    1. <update id="updateBatch" parameterType="java.util.List">

    2. update mydata_table

    3. <trim prefix="set" suffixOverrides=",">

    4. <trim prefix="status =case" suffix="end,">

    5. <foreach collection="list" item="item" index="index">

    6. when id=#{item.id} then #{item.status}

    7. </foreach>

    8. </trim>

    9. </trim>

    10. where id in

    11. <foreach collection="list" index="index" item="item" separator="," open="(" close=")">

    12. #{item.id,jdbcType=BIGINT}

    13. </foreach>

    14. </update>

    其结构如下:

    
     
    1. update mydata_table

    2. set status =

    3. case

    4. when id = #{item.id} then #{item.status}//此处应该是<foreach>展开值

    5. ...

    6. end

    7. where id in (...);

    如果对要更新的数据进行判断,只有符合条件的数据才能进行更新,这种情况可以这么做:

    
     
    1. <trim prefix="status =case" suffix="end,">

    2. <foreach collection="list" item="item" index="index">

    3. <if test="item.status !=null and item.status != -1">

    4. when id=#{item.id} then #{item.status}

    5. </if>

    6. </foreach>

    7. </trim>

    这样的话只有要更新的list中status != null && status != -1的数据才能进行status更新.其他的将使用默认值更新,而不会保持原数据不变.如果要保持原数据不变呢?即满足条件的更新,不满足条件的保持原数据不变,简单的来做就是再加一个<if>,因为mybatis中没有if...else...语法,但可以通过多个<if>实现同样的效果,如下:

    
     
    1. <trim prefix="status =case" suffix="end,">

    2. <foreach collection="list" item="item" index="index">

    3. <if test="item.status !=null and item.status != -1">

    4. when id=#{item.id} then #{item.status}

    5. </if>

    6. <if test="item.status == null or item.status == -1">

    7. when id=#{item.id} then mydata_table.status //这里就是原数据

    8. </if>

    9. </foreach>

    10. </trim>

    整体批量更新的写法如下:

    <updateid="updateBatch"parameterType="java.util.List">

    
     
    1. update mydata_table

    2. <trim prefix="set" suffixOverrides=",">

    3. <trim prefix="status =case" suffix="end,">

    4. <foreach collection="list" item="item" index="index">

    5. <if test="item.status !=null and item.status != -1">

    6. when id=#{item.id} then #{item.status}

    7. </if>

    8. <if test="item.status == null or item.status == -1">

    9. when id=#{item.id} then mydata_table.status//原数据

    10. </if>

    11. </foreach>

    12. </trim>

    13. </trim>

    14. where id in

    15. <foreach collection="list" index="index" item="item" separator="," open="(" close=")">

    16. #{item.id,jdbcType=BIGINT}

    17. </foreach>

    18. </update>

     

    转载自 https://blog.csdn.net/lu1024188315/article/details/78758943

     

    1.组装多个update语句,这种方式需要设置jdbc连接  allowMultiQueries=true

    
     
    1. <update id="updateEquementWaterTest" parameterType="java.util.List">

    2. <foreach collection="list" item="item" index="index">

    3. update rent_hl_room l

    4. SET l.water_meter_id=#{item.equipmentCode},

    5. l.water_meter_source_type=#{item.equipmentSource}

    6. WHERE

    7. l.room_id=#{item.roomId};

    8. </foreach>

    9. </update>

    2.case when

    
     
    1. UPDATE

    2. rent_hl_room l

    3. SET

    4. electricity_meter_id =

    5. CASE

    6. WHEN room_id = 1942

    7. THEN 180524348

    8. WHEN room_id = 1945

    9. THEN 180524480

    10. END,

    11. electricity_meter_source_type =

    12. CASE

    13. WHEN room_id = 1942

    14. THEN ym

    15. WHEN room_id = 1945

    16. THEN ym

    17. END

    18. WHERE room_id = 1942

    19. OR room_id = 1945

    
     
    1.  
    2. <update id="updateEquementWater" parameterType="java.util.List">

    3. update rent_hl_room l

    4. <trim prefix="set" suffixOverrides=",">

    5. <trim prefix="water_meter_id =case" suffix="end,">

    6. <foreach collection="list" item="i" index="index">

    7. <if test="i.equipmentCode!=null">

    8. when room_id=#{i.roomId} then #{i.equipmentCode}

    9. </if>

    10. </foreach>

    11. </trim>

    12. <trim prefix=" water_meter_source_type =case" suffix="end,">

    13. <foreach collection="list" item="i" index="index">

    14. <if test="i.equipmentSource!=null">

    15. when room_id=#{i.roomId} then #{i.equipmentSource}

    16. </if>

    17. </foreach>

    18. </trim>

    19. </trim>

    20. where

    21. <foreach collection="list" separator="or" item="i" index="index" >

    22. room_id=#{i.roomId}

    23. </foreach>

    24.  
    25. </update>

    经测试 100条数据的时候第一种方式的效率比第二种差不多高1倍。。。。。
       

    展开全文
  • MySql中4种批量更新的方法

    万次阅读 2019-04-18 18:24:55
    MySql中4种批量更新的方法 mysql 批量更新共有以下四种办法1、.replace into 批量更新 replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y'); 例子: replace into book ( 'Id', 'Author', '...

    MySql中4种批量更新的方法

      mysql 批量更新共有以下四种办法
    1、.replace into 批量更新

    replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y');

    例子

    replace into book (
        'Id',
        'Author',
        'CreatedTime',
        'UpdatedTime'
    ) values (
        1,
        '张飞',
        '2016-12-12 12:20',
        '2016-12-12 12:20'
    ),(
        2,
        '关羽',
        '2016-12-12 12:20',
        '2016-12-12 12:20');

    2、insert into ...on duplicate key update批量更新

    insert into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y') on duplicate key update dr=values(dr);

     例子

    insert into book 
    (`Id`,`Author`,`CreatedTime`,`UpdatedTime`) 
    values 
    (1,'张飞2','2017-12-12 12:20','2017-12-12 12:20'),
    (2,'关羽2','2017-12-12 12:20','2017-12-12 12:20') 
    on duplicate key update 
    Author=values(Author),
    CreatedTime=values(CreatedTime),
    UpdatedTime=values(UpdatedTime);

    replace into  和 insert into on duplicate key update的不同在于:

    • replace into 操作本质是对重复的记录先delete 后insert,如果更新的字段不全会将缺失的字段置为缺省值,用这个要悠着点否则不小心清空大量数据可不是闹着玩的。
    • insert into 则是只update重复记录,不会改变其它字段。

    3.创建临时表,先更新临时表,然后从临时表中update

     create temporary table tmp(id int(4) primary key,dr varchar(50));
     insert into tmp values  (0,'gone'), (1,'xx'),...(m,'yy');
     update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id;

    注意:这种方法需要用户有temporary 表的create 权限。
     

    4、使用mysql 自带的语句构建批量更新
        mysql 实现批量 可以用点小技巧来实现:

    UPDATE yoiurtable
    SET dingdan = CASE id 
        WHEN 1 THEN 3 
        WHEN 2 THEN 4 
        WHEN 3 THEN 5 
    END
    WHERE id IN (1,2,3)

    这句sql 的意思是,更新dingdan 字段,如果id=1 则dingdan 的值为3,如果id=2 则dingdan 的值为4……
    where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。   
    例子

    UPDATE book
    SET Author = CASE id 
        WHEN 1 THEN '黄飞鸿' 
        WHEN 2 THEN '方世玉'
        WHEN 3 THEN '洪熙官'
    END
    WHERE id IN (1,2,3)

    如果更新多个值的话,只需要稍加修改:

    UPDATE categories      
    SET dingdan = CASE id 
        WHEN 1 THEN 3 
        WHEN 2 THEN 4 
        WHEN 3 THEN 5 
    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 book
    SET Author = CASE id 
        WHEN 1 THEN '黄飞鸿2' 
        WHEN 2 THEN '方世玉2'
        WHEN 3 THEN '洪熙官2'
    END,
    Code = CASE id 
        WHEN 1 THEN 'HFH2' 
        WHEN 2 THEN 'FSY2'
        WHEN 3 THEN 'HXG2'
    END
    WHERE id IN (1,2,3)

    具体的MyBatis代码如下:

    <update id="update" parameterType="java.util.List">
        UPDATE dic_col_display
    	SET column_code = CASE id
    	<foreach collection="list" item="item" index="index" open="" separator="" close="">
    		WHEN #{item.id} THEN #{item.column_code} 
    	</foreach>
    	END,
    	column_desc = CASE id
    	<foreach collection="list" item="item" index="index" open="" separator="" close="">
    		WHEN #{item.id} THEN #{item.column_desc} 
    	</foreach>
    	END,
    	modify_user_id = CASE id
    	<foreach collection="list" item="item" index="index" open="" separator="" close="">
    		WHEN #{item.id} THEN #{item.modify_user_id} 
    	</foreach>
    	END,
    	modify_user_name = CASE id
    	<foreach collection="list" item="item" index="index" open="" separator="" close="">
    		WHEN #{item.id} THEN #{item.modify_user_name} 
    	</foreach>
    	END,
    	modify_date = NOW()
    	WHERE
    	  id in
    	  <foreach collection="list" item="item" index="index" open="(" separator="," close=")">
    		  #{item.id} 
    	  </foreach>
    </update>

     

    展开全文
  • 大批量更新数据mysql批量更新的四种方法

    万次阅读 多人点赞 2016-09-02 18:00:43
    mysql 批量更新如果一条条去更新效率是相当的慢, 循环一条一条的更新记录,一条记录update一次,这样性能很差,也很容易造成阻塞。 mysql 批量更新共有以下四种办法 1、.replace into 批量更新 replace ...

    转载一篇大批量更新mysql数据的办法,为了便于阅读根据原文做了缩减。

    mysql 批量更新如果一条条去更新效率是相当的慢, 循环一条一条的更新记录,一条记录update一次,这样性能很差,也很容易造成阻塞。

    mysql 批量更新共有以下四种办法

    1、.replace into 批量更新

    replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y');

    2、insert into ...on duplicate key update批量更新

    insert into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y') on duplicate key update dr=values(dr);

    3.创建临时表,先更新临时表,然后从临时表中update

    1. create temporary table tmp(id int(4) primary key,dr varchar(50));
    2. insert into tmp values  (0,'gone'), (1,'xx'),...(m,'yy');
    3. update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id;

    注意:这种方法需要用户有temporary 表的create 权限。

    4、使用mysql 自带的语句构建批量更新

    mysql 实现批量 可以用点小技巧来实现:

    1. UPDATE yoiurtable
    2.     SET dingdan = CASE id 
    3.         WHEN 1 THEN 3 
    4.         WHEN 2 THEN 4 
    5.         WHEN 3 THEN 5 
    6.     END
    7. WHERE id IN (1,2,3)

    这句sql 的意思是,更新dingdan 字段,如果id=1 则dingdan 的值为3,如果id=2 则dingdan 的值为4……
    where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

    如果更新多个值的话,只需要稍加修改:

    1. UPDATE categories 
    2.     SET dingdan = CASE id 
    3.         WHEN 1 THEN 3 
    4.         WHEN 2 THEN 4 
    5.         WHEN 3 THEN 5 
    6.     END, 
    7.     title = CASE id 
    8.         WHEN 1 THEN 'New Title 1'
    9.         WHEN 2 THEN 'New Title 2'
    10.         WHEN 3 THEN 'New Title 3'
    11.     END
    12. WHERE id IN (1,2,3)

    到这里,已经完成一条mysql语句更新多条记录了。

    php中用数组形式赋值批量更新的代码:

    1. $display_order = array( 
    2.     1 => 4, 
    3.     2 => 1, 
    4.     3 => 2, 
    5.     4 => 3, 
    6.     5 => 9, 
    7.     6 => 5, 
    8.     7 => 8, 
    9.     8 => 9 
    10. ); 

    11. $ids = implode(',', array_keys($display_order)); 
    12. $sql = "UPDATE categories SET display_order = CASE id "; 
    13. foreach ($display_order as $id => $ordinal) { 
    14.     $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); 
    15. $sql .= "END WHERE id IN ($ids)"; 
    16. echo $sql;

    这个例子,有8条记录进行更新。代码也很容易理解,你学会了吗

    更新 100000条数据的性能就测试结果来看,测试当时使用replace into性能较好。

    replace into  和 insert into on duplicate key update的不同在于:

    • replace into 操作本质是对重复的记录先delete 后insert,如果更新的字段不全会将缺失的字段置为缺省值,用这个要悠着点否则不小心清空大量数据可不是闹着玩的。
    • insert into 则是只update重复记录,不会改变其它字段。
    展开全文
  • SQL如何实现批量更新

    万次阅读 2018-08-06 21:58:10
    批量update mybatis //此处应该是&lt;foreach&gt;展开值 ... update mydata_table set status = case when id = #{item.id} then #{item.status} end where id in (...);   例如: update ...

    批量update  mybatis

    //此处应该是<foreach>展开值 ...

    update mydata_table set status = case when id = #{item.id} then #{item.status} end where id in (...);

     

    例如:

    update  TableName  set total =

    case

    when id = 1  then total + 120   

    when id = 2  then total + 130

    else total

    end   

    where id in (1,2)

    展开全文
  • mybatis 批量更新update详解

    万次阅读 2018-07-31 18:02:50
    更新单条记录  UPDATE course SET name = 'course1' WHEREid = 'id1'; 2 更新多条记录的同一个字段为同一个值  UPDATE course SET name='course1' WHERE id in('id1','id2','id3); 3 更新多条...
  • 更新多条数据,每条数据都不一样 背景描述:通常如果需要一次更新多条数据有两个方式,(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据(更准确的说是一条sql语句来更新所有数据,逐条更新的操作放到...
  • mybatis批量更新数据三种方法效率对比

    万次阅读 多人点赞 2019-03-20 15:07:04
    探讨批量更新数据三种写法的效率问题。 实现方式有三种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 还有一个是用ON DUPLICATE KEY ...
  • mysql及mybatis批量更新数据update

    万次阅读 2019-01-27 16:33:49
    mysql批量更新update 使用case when语句,数据表如下: case 1 其中age为非空字段。sql如下 update test1 set age=case when id=2 then 1 when id =3 then 2 end where id in (2,3,4) 对id为2,3,4的设置age字段...
  • mybaits批量更新的几种方法

    千次阅读 2019-06-17 14:32:31
    更新单条 update shop_manager set marketing_category = #{marketingCategory} where id=#{id} 更新多条且条件为多值的记录 比较普通的写法是逐条更新 优点:容易,不易出错,出错只影响当前行 缺点:效率差,每...
  • update 根据查询结果批量更新

    万次阅读 2018-10-11 11:48:36
    将a表has_visit字段设置为1 当(a表fk_handle_id 在b表存在的数据) UPDATE table1 a,( SELECT a.id FROM table1 a, table2 b WHERE a.fk_handle_id = b.fk_admin_id GROUP BY ...
  • 解决Mysql-无法批量更新的问题

    万次阅读 2020-05-12 16:06:14
    在连接字符串上加个 allowMultiQueries=true 参数即可 url:jdbc:mysql://localhost:3306/meicharacterEncoding=utf8&allowMultiQueries=true
  • sql的update语句 批量更新某字段

    万次阅读 2020-09-17 09:57:28
    1 有时候要实现字段的批量替换 update 表名 set 字段A = replace(字段A ,"png","jpg" ); 2 批量拼接字符串到某字段 update 表名 set 字段A = CONCAT( 字段A , "xxx" ); update ...
  • 批量更新某个字段 例1: db.getCollection('bond_sentiment_news').find({&quot;source&quot; : 2,&quot;siteUrl&quot; : &quot;http://www.21jingji.com/&quot;}).forEach( function...
  • SQLServer批量更新、批量插入

    万次阅读 多人点赞 2020-07-11 20:20:13
    最近遇到这样一个问题,项目中几个地方存储的地址只有一个字段,省市区县道路都在一起,地区检索用like,这简直是无法忍受,经商讨决定对原地址字段进行拆分,但是数据量相对较大,其中最少的一张表中有70万的数据,...
  • mybatis学习之路----批量更新数据两种方法效率对比

    万次阅读 多人点赞 2017-09-14 23:24:45
    点滴记载,点滴进步,愿自己更上一层楼。
  • 有表如下 t_user:字段如下 id,name,phone t_phone:字段如下 uid,phone 其中t_phone表的uid字段是外键并且唯一,他引用t_user的id字段,现需要将t_phone表的phone数据插入到t_user表中。...update的使用当针对于有...
  • Mybatis传入List实现批量更新

    万次阅读 热门讨论 2019-05-17 17:02:32
    * 批量更新新库存 * @param list * @return */ int updateNewStock(@Param(value = "list") List<GreenBeanMsg> list); xml具体实现代码 <update id="updateNewStock" paramet...
  • MyBatis 批量更新批量更新

    千次阅读 2019-12-12 18:35:23
    &amp;amp;amp;amp;amp;amp;lt;insert id=&amp;amp;amp;amp;amp;quot;insertBatch&amp;amp;amp;amp;amp;quot; useGeneratedKeys=&amp;amp;amp;amp;amp;quot;true&amp;amp;...amp
  • MyBatis批量更新Mysql数据

    万次阅读 2018-11-14 17:43:05
    MyBatis 批量更新数据 1. 数据库语句 #使用SQL一次批量更新多条记录 UPDATE rba_house_status SET audit_status = ( CASE WHEN house_id = 100023 then 3 END ), audit_desc = ( CASE WHEN house_id = 100010 ...
  • hibernate处理批量更新和批量删除

    万次阅读 2012-03-20 11:13:06
    9.4 批量处理数据 通常,在一个Session对象的缓存中只存放数量有限的持久化对象,等到Session对象...以下程序在一个事务中批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段: Transaction tx = session.beginTr
1 2 3 4 5 ... 20
收藏数 202,361
精华内容 80,944
关键字:

批量更新