mysql

mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

复制代码
UPDATE categories SET
    display_order = CASE id
        WHEN 1 THEN 3
        WHEN 2 THEN 4
        WHEN 3 THEN 5
    END
WHERE id IN (1,2,3)


UPDATE `post` SET 
`id` = CASE `id` 
    WHEN '1' THEN '1' 
    WHEN '2' THEN '2' 
    WHEN '3' THEN '3' 
       END,
`sort` = CASE `id` 
    WHEN '1' THEN '1' 
    WHEN '2' THEN '3' 
    WHEN '3' THEN '5' 
       END 
WHERE `id` IN ('1','2','3')
复制代码
这句sql的意思是,更新display_order 字段:

如果id=1 则display_order 的值为3,
如果id=2 则 display_order 的值为4,
如果id=3 则 display_order 的值为5。
即是将条件语句写在了一起。

这里的where部分不影响代码的执行,但是会提高sql执行的效率。

确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

可以在程序中拼接 批量更新的sql--------自己试验 

 <!-- 批量更新第一种方法,通过接收传进来的参数list进行循环着组装sql -->
    <update id="batchUpdate" parameterType="java.util.Map">
        <!-- 接收list参数,循环着组装sql语句,注意for循环的写法
             separator=";" 代表着每次循环完,在sql后面放一个分号
             item="cus" 循环List的每条的结果集
             collection="list" list 即为 map传过来的参数key -->
        <foreach collection="list" separator=";" item="cus">
            update t_customer set
            c_name = #{cus.name},
            c_age = #{cus.age},
            c_sex = #{cus.sex},
            c_ceroNo = #{cus.ceroNo},
            c_ceroType = #{cus.ceroType}
            where id = #{cus.id}
        </foreach>
    </update>
 
    <!-- 批量更新第二种方法,通过 case when语句变相的进行批量更新 -->
    <update id="batchUpdateCaseWhen" parameterType="java.util.Map">
        update t_customer
        <trim prefix="set" suffixOverrides=",">
            <!-- 拼接case when 这是一种写法 -->
            <!--<foreach collection="list" separator="" item="cus" open="c_age = case id" close="end, ">-->
            <!--when #{cus.id} then #{cus.age}-->
            <!--</foreach>-->
 
            <!-- 拼接case when 这是另一种写法,这种写着更专业的感觉 -->
            <trim prefix="c_name =case" suffix="end,">
                <foreach collection="list" item="cus">
                    <if test="cus.name!=null">
                        when id=#{cus.id} then #{cus.name}
                    </if>
                </foreach>
            </trim>
            <trim prefix="c_age =case" suffix="end,">
                <foreach collection="list" item="cus">
                    <if test="cus.age!=null">
                        when id=#{cus.id} then #{cus.age}
                    </if>
                </foreach>
            </trim>
            <trim prefix="c_sex =case" suffix="end,">
                <foreach collection="list" item="cus">
                    <if test="cus.sex!=null">
                        when id=#{cus.id} then #{cus.sex}
                    </if>
                </foreach>
            </trim>
            <trim prefix="c_ceroNo =case" suffix="end,">
                <foreach collection="list" item="cus">
                    <if test="cus.ceroNo!=null">
                        when id=#{cus.id} then #{cus.ceroNo}
                    </if>
                </foreach>
            </trim>
            <trim prefix="c_ceroType =case" suffix="end,">
                <foreach collection="list" item="cus">
                    <if test="cus.ceroType!=null">
                        when id=#{cus.id} then #{cus.ceroType}
                    </if>
                </foreach>
            </trim>
        </trim>
        <where>
            <foreach collection="list" separator="or" item="cus">
                id = #{cus.id}
            </foreach>
        </where>
    </update>
//第一种效率更高一些


//批量添加或更新
https://www.jianshu.com/p/a055b4778769
replace的工作机制有点像insert,只不过如果在表里如果一行有PRIMARY KEY或者UNIQUE索引,那么就会把老行删除然后插入新行
<insert id="insertRecords" parameterType="java.util.List">
            replace into bi_staff_skill_information
            (staff_id, skill_id, skill_level)values
            <foreach item="staffSkillInfo" index="index" collection="list"
                 open="(" separator="),(" close=")">
                #{staffSkillInfo.staffId},#{staffSkillInfo.skillId},#{staffSkillInfo.skillLevel}
            </foreach>
</insert>
http://www.thinkphp.cn/topic/46243.html
mysql replace实例说明: 
UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); 
REPLACE(str,from_str,to_str) 
在字符串 str 中所有出现的字符串 from_str 均被 to_str替换,然后返回这个字符串 
这个函数用来批量替换数据中的非法关键字是很有用的!如下例子: 
例1:UPDATE BBSTopic SET tcontents = replace(replace(tcontents,'共产党','') ,'找死','') where tcontents like '%共产党%' or tcontents like '%找死%' 
例2:UPDATE typetable SET type_description=REPLACE(type_description,'360','http://www.baicai.net'); 
mysql replace用法 
1.replace into 
replace into table (id,name) values('1','aa'),('2','bb') 
此语句的作用是向表table中插入两条记录。如果主键id为1或2不存在 
就相当于 
insert into table (id,name) values('1','aa'),('2','bb') 
如果存在相同的值则不会插入数据 
2.replace(object,search,replace) 
把object中出现search的全部替换为replace 
select replace('www.baicai.net','w','Ww')--->WwWwWw.baicai.net 
例:把表table中的name字段中的aa替换为bb 
update table set name=replace(name,'aa','bb') 
MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪。 
最近在研究CMS,在数据转换的时候需要用到mysql的MySQL replace函数,这里简单介绍一下。 
比如你要将表 tb1里面的 f1字段的abc替换为def 
UPDATE tb1 SET f1=REPLACE(f1, 'abc', 'def'); 
REPLACE(str,from_str,to_str) 
在字符串 str 中所有出现的字符串 from_str 均被 to_str替换,然后返回这个字符串: 
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); 
-> 'WwWwWw.mysql.com' 
这个函数是多字节安全的。 
示例: 
UPDATE `dede_addonarticle` SET body = REPLACE ( body, 
'</td>', 
'' ); 
UPDATE `dede_addonarticle` SET body = REPLACE ( body, 
'</tr>', 
'' ); 
UPDATE `dede_addonarticle` SET body = REPLACE ( body, 
'<tr>', 
'' ); 
UPDATE `dede_archives` SET title= REPLACE ( title, 
'大洋新闻 - ', 
'' ); 
UPDATE `dede_addonarticle` SET body = REPLACE ( body, 
'../../../../../../', 
'http://special.dayoo.com/meal/' ); 
mysql replace 
用法1.replace intoreplace into table (id,name) values(‘1‘,‘aa‘),(‘2‘,‘bb‘) 
此语句的作用是向表table中插入两条记录。 
2.replace(object, search,replace) 
把object中出现search的全部替换为replaceselect replace(‘www.baicai.net‘,‘w‘,‘Ww‘)--->WwW wWw.baicai.net 
例:把表table中的name字段中的 aa替换为bbupdate table set name=replace(name,‘aa‘,‘bb‘) 
复制代码


https://www.cnblogs.com/shuaifing/p/9327465.html
<!-- 批量保存(foreach插入多条数据两种方法)
       int addEmpsBatch(@Param("emps") List<Employee> emps); -->
     <!-- MySQL下批量保存,可以foreach遍历 mysql支持values(),(),()语法 --> //推荐使用
     <insert id="addEmpsBatch">
      INSERT INTO emp(ename,gender,email,did)
      VALUES
      <foreach collection="emps" item="emp" separator=",">
      (#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
      </foreach>
     </insert>
     
     <!-- 这种方式需要数据库连接属性allowMutiQueries=true的支持 -->  //在jdbc.url=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true
    <!--  <insert id="addEmpsBatch">                                                                                                                 后加上allowMultiQueries=true
       <foreach collection="emps" item="emp" separator=";">                                                                        表示可以多次执行insert into语句,中间;不会错
         INSERT INTO emp(ename,gender,email,did)
         VALUES(#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})
      </foreach>
     </insert> -->

<!-- 批量删除 -->
    <delete id="deleteMoreEmp" parameterType="int[]">
        <!-- delete from emp where empno in(7789,7790) -->
        <!-- forEach : 用来循环 collection : 用来指定循环的数据的类型 可以填的值有:array,list,map item 
            : 循环中为每个循环的数据指定一个别名 index : 循环中循环的下标 open : 开始 close : 结束 separator : 数组中元素之间的分隔符 -->
        delete from emp where empno in
        <foreach collection="array" item="arr" index="no" open="("
            separator="," close=")">
            #{arr}
        </foreach>
    </delete>

<delete id="deleteByLogic"  parameterType = "java.util.List">
     delete from user where 1>2
         or id in  ${ids}
</delete>
https://www.jianshu.com/p/041bec8ae6d3
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值