Mysql批量动态修改数据,用临时表的方法,三步解决。

一、 为什么会用?

在数据迁移的过程中,批量修改数据的几个字段。

二、思路:
1.把所要修改的数据查询出来。
2.新建临时表,将查询出来的数据存进临时表中。
3.将要查入数据的表和临时表做关联,将需要更新的字段进行修改。
三、实现代码
1.这是我的SQL逻辑,你们的根据你们的逻辑写就行了。

select *
from (select service.NAME as NAME 
           , service.UNIT
           , t4.org_name           as SUPPLY_NAME
           , '1'                   as flag
      from (
               select sazk.id,
                      IF(sazk.UNIT = '09', '03', sazk.UNIT) as UNIT,
                      t2.NAME 
               from (select id,
                            IF(SUBSTRING(UNIT, 1, 2) = '08', '03',
                               SUBSTRING(UNIT, 1, 2)) as UNIT
                     from table1
                    ) sazk
                        inner join table2 t2 ON sazk.id= t2.SUPP_ID
               group by t2.NAME 
               having count(1) > 1
           ) service
               left join table3 t4 ON service.UNIT= t4.org_no) mult
UNION ALL
(

    select service.NAME as NAME 
         , service.UNIT   as UNIT
         , t4.org_name           as SUPPLY_NAME
         , '2'                   as flag
    from (
             select sazk.id,
                    UNIT,
                    t2.NAME 
             from (select id,
                          SUBSTRING(UNIT, 1, 4) as UNIT
                   from table1
                  ) sazk
                      inner join table2 t2 ON sazk.id= t2.SUPP_ID
             group by t2.NAME 
             having count(1) = 1
         ) service
             inner join table3 t4 ON service.UNIT= t4.org_no
);

2.新建临时表,将上边的逻辑复制过来就好了

-- 因为测试的时候要看表是否存在
drop temporary table if exists serviceTemp;
-- 创建临时表
create temporary table serviceTemp
select *
from (select service.NAME as NAME 
           , service.UNIT
           , t4.org_name           as SUPPLY_NAME
           , '1'                   as flag
      from (
               select sazk.id,
                      IF(sazk.UNIT = '09', '03', sazk.UNIT) as UNIT,
                      t2.NAME 
               from (select id,
                            IF(SUBSTRING(UNIT, 1, 2) = '08', '03',
                               SUBSTRING(UNIT, 1, 2)) as UNIT
                     from table1
                    ) sazk
                        inner join table2 t2 ON sazk.id= t2.SUPP_ID
               group by t2.NAME 
               having count(1) > 1
           ) service
               left join table3 t4 ON service.UNIT= t4.org_no) mult
UNION ALL
(

    select service.NAME as NAME 
         , service.UNIT   as UNIT
         , t4.org_name           as SUPPLY_NAME
         , '2'                   as flag
    from (
             select sazk.id,
                    UNIT,
                    t2.NAME 
             from (select id,
                          SUBSTRING(UNIT, 1, 4) as UNIT
                   from table1
                  ) sazk
                      inner join table2 t2 ON sazk.id= t2.SUPP_ID
             group by t2.NAME 
             having count(1) = 1
         ) service
             inner join table3 t4 ON service.UNIT= t4.org_no
);

3.更新所修改的数据

update mk_temp t1,serviceTemp t2
set t1.UNIT     =t2.UNIT     ,
    t1.SUPPLY_NAME=t2.SUPPLY_NAME,
    t1.CREATE =t2.flag
where t1.SUP_NAME =t2.SUPPLIER_NAME;

到这里就完成了,
要有什么更简单的方法,交流一下

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和\[2\]的信息,可以使用导出和导入数据方法批量修改MySQL表的数据。通过使用OUTFILE命令将数据导出到一个文件中,然后对文件进行修改,最后使用LOAD DATA INFILE命令将修改后的数据导入到表中。这种方法可以大大减少数据库的查询操作次数,节约系统资源。同时,根据引用\[2\]的说明,这种方法的性能比一次性插入一条数据快20倍。 另外,根据引用\[3\]的信息,需要注意SQL语句的长度限制。如果SQL语句超过了程序运行环境所支持的字符串长度,可以通过更新MySQL的设置来扩展。可以通过执行"show variables like 'max_allowed_packet'"命令来查看当前的max_allowed_packet设置,然后根据需要修改my.cnf文件中的max_allowed_packet参数,或者使用"set global max_allowed_packet=10000000"命令来修改全局级的设置,或者使用"set session max_allowed_packet=10000000"命令来修改会话级的设置。 综上所述,可以使用导出和导入数据方法批量修改MySQL表的数据,并根据需要修改max_allowed_packet参数来避免SQL语句长度限制的问题。 #### 引用[.reference_title] - *1* *2* *3* [MySql中几种批量更新/新增/删除的方法](https://blog.csdn.net/hudeyong926/article/details/104831441)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值