MySQL批量更新的四种方式总结

目录
  • 直接update的弊端
  • 方法一;replace into
  • 方法二:insert into [table] values… on duplicate key update
  • 方法三:创建临时表
  • 总结

直接update的弊端

最近做一个需求,更新3w条数据,一个一个update去更新的,结果花了80分钟,这样性能上很差,也容易阻塞,所以就找了一些MySQL批量更新的方式,在此记录一下

方法一;replace into

这种更新会将其它字段更新为默认值,因为它是先将重复记录删掉再更新,谨慎使用

replace into `user` (id,age) values (1,'2'),(2,'3'),(3,'4'),(4,'98');
-- > 时间: 0.038s

方法二:insert into [table] values… on duplicate key update

这种方式应该也是删掉记录,再更新,但是保存的原来的其它字段数据,所以其它字段不会改变

insert into `user`(id,age) values (1,'5'),(2,'7'),(3,'2'),(4,'198') on duplicate key update age=values(age)
-- > > 时间: 0.017s

方法三:创建临时表

创建临时表,将更新数据插入临时表,再执行更新,需要有建表权限

DROP TABLE if EXISTS tmp;
-- > 时间: 0.016s

create temporary table tmp(id int(4) primary key,age varchar(50));
-- > 时间: 0.01s

insert into tmp values  (1,'13'), (2,'16'),(3,'18'),(4,'18');
-- > 时间: 0.009s

update `user`, tmp set `user`.age=tmp.age where `user`.id=tmp.id;
-- > 时间: 0.022s

方法四:使用MySQL自带批量更新语句

update `user`
	set age = CASE id
	WHEN 1 THEN '22'
	WHEN 2 THEN '22'
	WHEN 3 THEN '22'
	WHEN 4 THEN '22'
END WHERE id IN(1,2,3,4);
-- > 时间: 0.015s

update (表名)
set (更新字段) = case (被更新字段)
when (被更新字段值) then (更新字段值)...
end where (被更新字段) in((被更新字段值)...)

举例说明:set age = CASE id WHEN 1 THEN ‘22’

简单来说就是以id为查询条件,当id=1时更新age=22,where语句提高了sql的执行效率,先过滤需要修改的记录然后再更新。

总结

到此这篇关于MySQL批量更新的四种方式的文章就介绍到这了,更多相关MySQL批量更新内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 复制代码 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 复制代码 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values'); 这里注意 'o

  • Mysql Update批量更新的几种方式

    通常情况下,我们会使用以下SQL语句来更新字段值: UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的python程序示例: for x in xrange(10): sql = ''' UPDATE mytable SET myfield='value' WHERE

  • mysql批量更新多条记录的同一个字段为不同值的方法

    首先mysql更新数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 也可以这样用in指定要更新的记录: UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values'); 这里注意 'other_values' 是一个逗号(,)分隔的字符串,如:1,2,3 如果更新多条数据而且每条记录要更新

  • MySQL实现批量更新不同表中的数据

    目录 批量更新不同表的数据 下面为当时所编写的存储过程 本代码涉及到的MySQL的内容为 批量更新语句(UPDATE) 使用UPDATE语句实现批量修改 创建数据库‘bhl_tes’ 创建表‘test_user’ 批量插入记录 批量修改记录 批量更新不同表的数据 今天翻到以前写的批量更新表中的数据的存储过程,故在此做一下记录. 当时MySQL中的表名具有如下特征,即根据需求将业务表类型分为了公有.私有和临时三种类型,即不同的业务对应三张表,而所做的是区分出是什么类型(公有.私有.临时)的业务表对

  • MySQL批量更新的四种方式总结

    目录 直接update的弊端 方法一:replace into 方法二:insert into [table] values… on duplicate key update 方法三:创建临时表 总结 直接update的弊端 最近做一个需求,更新3w条数据,一个一个update去更新的,结果花了80分钟,这样性能上很差,也容易阻塞,所以就找了一些MySQL批量更新的方式,在此记录一下 方法一:replace into 这种更新会将其它字段更新为默认值,因为它是先将重复记录删掉再更新,谨慎使用 r

  • 详解MySQL批量入库的几种方式

    目录 1. MySQL批量入库概述 2. Hutool封装jdbc方式 测试环境准备 3. Jdbc直接或批量执行方式 4. MyBatis批量入库方式 5. MySQL批量入库总结 1. MySQL批量入库概述 最近压测一款mysql持久化工具,目前市面上mysql批量入库方式有很多,这里分别对常用的几种方式进行压测对比分析,比如列举了hutool工具封装的jdbc方式,jdbc直接执行与批量执行的方式,以及常用的mybatis方式. 2. Hutool封装jdbc方式 Hutool-db是一

  • 详解android进行异步更新UI的四种方式

    大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正: 使用Handler消息传递机制: 使用AsyncTask异步任务: 使用runOnUiThread(action)方法: 使用Handler的post(Runnabel r)方法: 下面分别使用四种方式来更新一个TextView. 1.使用Handler消息传递机制 package com.example.runonuithreadtest; import andr

  • 详解C#批量插入数据到Sqlserver中的四种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生成一个GUID算法所花的时间肯定比你从数据表中重新查询上一条记录的ID的值然后再进行加1运算要少.而如果存在索引的情况下,每次插入记录都会进行索引重建,这是非常耗性能的.如果表中无可避免的存在索引,我们可以通过先删除索引,然后批量插入,最后再重建索引的方式来提高效率. create database C

  • Android异步更新UI的四种方式

    大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有4种方式,下面分别使用四种方式来更新一个TextView. 1.使用Handler消息传递机制 package com.example.runonuithreadtest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView;

  • MyBatis批量插入的几种方式效率比较

    目录 前言 一.前期准备 1.1 表结构 1.2 项目配置文件 1.3 实体类 二.反复执行单条插入语句 2.1 对应 mapper 接口 2.2 测试方法 三.foreach 拼接SQL 3.1 对应mapper 接口 3.2 测试方法 3.3 执行时间 四.批处理 4.1 rewriteBatchedStatements 参数 4.2 批处理准备 4.3 执行时间 4.4 如果数据更大 五.总结 前言 批处理数据主要有三种方式: 反复执行单条插入语句 foreach 拼接 sql 批处理 一

  • 详解mybatis 批量更新数据两种方法效率对比

    上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql://localhost:3306/mysqlTest?characterEncoding=utf-8&allowMulti

  • 详解MySQL双活同步复制四种解决方案

    对于数据实时同步,其核心是需要基于日志来实现,是可以实现准实时的数据同步,基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束. 基于MySQL原生复制主主同步方案  这是常见的方案,一般来说,中小型规模的时候,采用这种架构是最省事的. 两个节点可以采用简单的双主模式,并且使用专线连接,在master_A节点发生故障后,应用连接快速切换到master_B节点,反之也亦然.有几个需要注意的地方,脑裂的情况,两个节点写入相同数据而引发冲突,同时把两个节点的auto_increment_in

  • 详解MySQL数据库优化的八种方式(经典必看)

    引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂. 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小. 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(

随机推荐