批量update_hana批量update - CSDN
精华内容
参与话题
  • 批量update的几种方式

    千次阅读 2017-03-26 14:44:34
    通过多次执行update tablename set () values(); 适用于并发少,不会对数据库造成较大压力的情况下使用; 2.使用foreach mapper栗子如下: "updatePayNoticketsBatch" parameterType="java.util.List"> ...

    1.最简单的方式

    通过多次执行update tablename set () values();

    适用于并发少,不会对数据库造成较大压力的情况下使用;

    2.使用foreach

    mapper栗子如下:

        <update id="updatePayNoticketsBatch" parameterType="java.util.List">
            <foreach collection="payNoticketModels" item="payNoticketModel" index="index" separator=";">
                UPDATE
                pay_no_ticket
                SET
                risk_type=#{payNoticketModel.riskType},
                pin_money_status=#{payNoticketModel.pinMoneyStatus},
                pin_money_ratio=#{payNoticketModel.pinMoneyRatio},
                single_ticket_pin_money=#{payNoticketModel.singleTicketPinMoney},
                pin_money_total_sum=#{payNoticketModel.pinMoneyTotalSum}
                WHERE
                id=#{payNoticketModel.id}
            </foreach>
        </update>

    优点:减少代码量;

    缺点:并没有减少db的访问次数,每次update实际上都同数据库建立了一次链接

    3.使用set...when,栗子如下:

    UPDATE mytable
        SET myfield = CASE id
            WHEN 1 THEN 'value'
            WHEN 2 THEN 'value'
            WHEN 3 THEN 'value'
        END
    WHERE id IN (1,2,3)

    优点,减少代码量,减少了db的压力

    缺点,不适合大批量的情况,不方便进行字符串拼接;

    适用于小批量的情况;

    4.使用ON DUPLICATE KEY UPDATE

        <insert id="updatePayNoticketsBatch" parameterType="java.util.List">
            INSERT INTO pay_no_ticket
            (id,order_no,risk_type,pin_money_status,pin_money_ratio,single_ticket_pin_money,pin_money_total_sum,flight_segment_type)
            VALUES
            <foreach collection="payNoticketModels" item="payNoticketModel" index="index" separator=",">
                (#{payNoticketModel.id},
                #{payNoticketModel.orderNo},
                #{payNoticketModel.riskType},
                #{payNoticketModel.pinMoneyStatus},
                #{payNoticketModel.pinMoneyRatio},
                #{payNoticketModel.singleTicketPinMoney},
                #{payNoticketModel.pinMoneyTotalSum},
                #{payNoticketModel.flightSegmentType})
            </foreach>
            ON DUPLICATE KEY UPDATE
            risk_type=VALUES (risk_type),
            pin_money_status=VALUES (pin_money_status),
            pin_money_ratio=VALUES(pin_money_ratio),
            single_ticket_pin_money = VALUES(single_ticket_pin_money),
            pin_money_total_sum=VALUES (pin_money_total_sum)
        </insert>
    展开全文
  • 大批量更新数据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重复记录,不会改变其它字段。
    展开全文
  • mybatis 批量更新update详解

    万次阅读 2018-07-12 13:49:38
    转载:https://blog.csdn.net/lu1024188315/article/details/78758943点击打开链接转载:https://blog.csdn.net/xyjawq1/article/details/74129316点击打开链接1 更新单条记录 UPDATE course SET name = 'course...

    转载:https://blog.csdn.net/lu1024188315/article/details/78758943点击打开链接

    转载:https://blog.csdn.net/xyjawq1/article/details/74129316点击打开链接

    1  更新单条记录 

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

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

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

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

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

    Mybatis写法如下: 

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

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

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

     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)

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

    在Mybatis中的配置则如下:

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

                update course
                <trim prefix="set" suffixOverrides=",">
                 <trim prefix="name=case" suffix="end,">
                     <foreach collection="list" item="item" index="index">
                             <if test="item.name!=null">
                              when id=#{item.id} then #{item.name}
                             </if>
                     </foreach>
                  </trim>
                  <trim prefix="title =case" suffix="end,">
                     <foreach collection="list" item="item" index="index">
                             <if test="item.title!=null">
                              when id=#{item.id} then #{item.title}
                             </if>
                     </foreach>
                  </trim>
                 </trim>
                where
                <foreach collection="list" separator="or" item="item" index="index">
                  id=#{item.id}
              </foreach>
    </update>
    <trim>属性说明 
    1.prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容 
    2.如果同时有prefixOverrides,suffixOverrides 表示会用prefix,suffix覆盖Overrides中的内容。 
    3.如果只有prefixOverrides,suffixOverrides 表示删除开头的或结尾的xxxOverides指定的内容。
    4  sql批量更新   
         看另外一个示例:
         <updateid="updateBatch"parameterType="java.util.List">
        update mydata_table 
        set  status=
        <foreach collection="list" item="item" index="index" 
            separator=" " open="case ID" close="end">
            when #{item.id} then #{item.status}
        </foreach>
        where id in
        <foreach collection="list" index="index" item="item" 
            separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>
     </update>
         其中when...then...sql中的"switch" 语法。这里借助mybatis<foreach>语法来拼凑成了批量更新的sql,上面的意思就是批量更新idupdateBatch参数所传递List中的数据的status字段。还可以使用<trim>实现同样的功能,代码如下:
    <update id="updateBatch" parameterType="java.util.List">
            update mydata_table
            <trim prefix="set" suffixOverrides=",">
                <trim prefix="status =case" suffix="end,">
                    <foreach collection="list" item="item" index="index">
                         when id=#{item.id} then #{item.status}
                    </foreach>
                </trim>
            </trim>
            where id in
            <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
                #{item.id,jdbcType=BIGINT}
            </foreach>
    </update>
    其结构如下:
        update mydata_table 
        set status = 
        case
            when id = #{item.id} then #{item.status}//此处应该是<foreach>展开值
            ...
        end
        where id in (...);
    如果对要更新的数据进行判断,只有符合条件的数据才能进行更新,这种情况可以这么做:
    <trim prefix="status =case" suffix="end,">
         <foreach collection="list" item="item" index="index">
             <if test="item.status !=null and item.status != -1">
                 when id=#{item.id} then #{item.status}
             </if>
         </foreach>
    </trim>
    这样的话只有要更新的liststatus != null && status != -1的数据才能进行status更新.其他的将使用默认值更新,而不会保持原数据不变.如果要保持原数据不变呢?即满足条件的更新,不满足条件的保持原数据不变,简单的来做就是再加一个<if>,因为mybatis中没有if...else...语法,但可以通过多个<if>实现同样的效果,如下:
    <trim prefix="status =case" suffix="end,">
         <foreach collection="list" item="item" index="index">
             <if test="item.status !=null and item.status != -1">
                 when id=#{item.id} then #{item.status}
             </if>
             <if test="item.status == null or item.status == -1">
                 when id=#{item.id} then mydata_table.status      //这里就是原数据
             </if>
         </foreach>
    </trim>
    整体批量更新的写法如下:
    <updateid="updateBatch"parameterType="java.util.List">
            update mydata_table
            <trim prefix="set" suffixOverrides=",">
                <trim prefix="status =case" suffix="end,">
                     <foreach collection="list" item="item" index="index">
                         <if test="item.status !=null and item.status != -1">
                             when id=#{item.id} then #{item.status}
                         </if>
                         <if test="item.status == null or item.status == -1">
                             when id=#{item.id} then mydata_table.status//原数据
                         </if>
                     </foreach>
                </trim>
            </trim>
            where id in
            <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
                #{item.id,jdbcType=BIGINT}
            </foreach>
    </update>

    展开全文
  • 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>

     

    展开全文
  • Oracle批量、大量Update方法总结

    万次阅读 2018-11-29 10:11:57
     (2)从表Boy的name属性被业务修改,定时批量处理主表,以维持主表name属性与从表一致   二、表结构 1、主表 Student 2、从表 Boy   三、建表SQL(DDL)  1、主表 Student -- ...
  • update 根据查询结果批量更新

    万次阅读 2018-10-11 11:48:36
    将a表has_visit字段设置为1 当(a表fk_handle_id...UPDATE table1 a,( SELECT a.id FROM table1 a, table2 b WHERE a.fk_handle_id = b.fk_admin_id GROUP BY a.id ) d SET a.has_visit =1 ...
  • 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字段...
  • mybatis批量更新数据三种方法效率对比

    万次阅读 多人点赞 2019-03-20 15:07:04
    探讨批量更新数据三种写法的效率问题。...还有一个是用ON DUPLICATE KEY UPDATE进行批量更新 下面进行实现。 注意第一种方法要想成功,需要在db链接url后面带一个参数 &allowMultiQueries=...
  • sql的update语句 批量更新某字段

    万次阅读 2020-09-17 09:57:28
    1 有时候要实现字段的批量替换 update 表名 set 字段A = replace(字段A ,"png","jpg" ); 2 批量拼接字符串到某字段 update 表名 set 字段A = CONCAT( 字段A , "xxx" ); update ...
  • mongo update批量更新

    万次阅读 2018-03-06 10:50:13
    参考链接 https://docs.mongodb.com/manual/reference/method/db.collection.update/findAndModify只会更新一个, update可以批量更新db.getCollection('cuishou_user').update( {'id':{$in:[1,2,3,10,12,13]}}, //...
  • mysql批量执行一万多条update
  • update join 连接语句批量更新

    万次阅读 2017-01-04 15:55:04
    update a join b on a.id=b.id set a.name=b.name where a.year=2016;
  • Mysql使用ON DUPLICATE KEY UPDATE批量操作

    万次阅读 2017-05-20 20:01:56
    UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别适用于多...
  • Mybatis传入List实现批量更新

    万次阅读 热门讨论 2019-05-17 17:02:32
    * 批量更新新库存 * @param list * @return */ int updateNewStock(@Param(value = "list") List<GreenBeanMsg> list); xml具体实现代码 <update id="updateNewStock" paramet...
  • UPDATE result,tmp SET result.forward_count=ROUND(tmp.fca_s), result.comment_count=ROUND(tmp.cca_s), result.like_count=ROUND(tmp.lca_s) WHERE result.uid=tmp.uid; ``` 两个表的数据都达到了一百万...
  • 有表如下 t_user:字段如下 id,name,phone t_phone:字段如下 uid,phone 其中t_phone表的uid字段是外键并且...update的使用当针对于有关联的表时,update可以后接两个或多个表名 Mysql--针对于全部数据 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 ...
  • mysql update 批量更新方式

    万次阅读 2018-06-08 17:37:19
    UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?刚开始你可能会想到使用循环执行多条UPDATE语句的方式,...
  • mysql 批量更新 update foreach

    万次阅读 2015-12-25 17:38:08
    <update id="updateThreadreturnList" parameterType="java.util.List"> update tb_thread set isDelete=0 where threadId in ( <foreach collection="list" item="item" index="index" open
  • 扩展Update实现在linq中进行批量更新

    万次阅读 2014-07-24 10:24:11
    这篇文章讲解的很详细, http://www.cnblogs.com/coolcode/archive/2010/07/11/LinqToSQL_Batch_Update.html 
1 2 3 4 5 ... 20
收藏数 110,461
精华内容 44,184
关键字:

批量update