侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

数据库  /  管理员 发布于 6年前   225

首先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

如果更新多条数据而且每条记录要更新的值不同,可能很多人会这样写:

foreach ($values as $id => $myvalue) { $sql = "UPDATE mytable SET myfield = $myvalue WHERE id = $id"; mysql_query($sql);}

即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。

那么能不能一条sql语句实现批量更新呢?

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

UPDATE mytable SET myfield = CASE id WHEN 1 THEN 'myvalue1' WHEN 2 THEN 'myvalue2' WHEN 3 THEN 'myvalue3' ENDWHERE other_field ('other_values')

如果where条件查询出记录的id不在CASE范围内,myfield将被设置为空。

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

UPDATE mytable SET myfield1 = CASE id WHEN 1 THEN 'myvalue11' WHEN 2 THEN 'myvalue12' WHEN 3 THEN 'myvalue13' END, myfield2 = CASE id WHEN 1 THEN 'myvalue21' WHEN 2 THEN 'myvalue22' WHEN 3 THEN 'myvalue23' ENDWHERE id IN (1,2,3)

这里以php为例,构造这两条mysql语句:

1、更新多条单个字段为不同值, mysql模式

$ids_values = array( 1 => 11, 2 => 22, 3 => 33, 4 => 44, 5 => 55, 6 => 66, 7 => 77, 8 => 88,); $ids = implode(',', array_keys($ids_values ));$sql = "UPDATE mytable SET myfield = CASE id ";foreach ($ids_values as $id=> $myvalue) { $sql .= sprintf("WHEN %d THEN %d ", $id, $myvalue);}$sql .= "END WHERE id IN ($ids)";echo $sql.";<br/>";

输出:

UPDATE mytable SET myfield = CASE id WHEN 1 THEN 11 WHEN 2 THEN 22 WHEN 3 THEN 33 WHEN 4 THEN 44 WHEN 5 THEN 55 WHEN 6 THEN 66 WHEN 7 THEN 77 WHEN 8 THEN 88 END WHERE id IN (1,2,3,4,5,6,7,8);

2、更新多个字段为不同值, PDO模式

$data = array(array('id' => 1, 'myfield1val' => 11, 'myfield2val' => 111), array('id' => 2, 'myfield1val' => 22, 'myfield2val' => 222));$where_in_ids = implode(',', array_map(function($v) {return ":id_" . $v['id'];}, $data));$update_sql = 'UPDATE mytable SET';$params = array();$update_sql .= ' myfield1 = CASE id';foreach($data as $key => $item) { $update_sql .= " WHEN :id_" . $key . " THEN :myfield1val_" . $key . " "; $params[":id_" . $key] = $item['id']; $params[":myfield1val_" . $key] = $item['myfield1val'];}$update_sql .= " END";$update_sql .= ',myfield2 = CASE id';foreach($data as $key => $item) { $update_sql .= " WHEN :id_" . $key . " THEN :myfield2val_" . $key . " "; $params[":id_" . $key] = $item['id']; $params[":myfield1va2_" . $key] = $item['myfield2val'];}$update_sql .= " END";$update_sql .= " WHERE id IN (" . $where_in_ids . ")";echo $update_sql.";<br/>";var_dump($params);

输出:

UPDATE mytable SET myfield1 = CASE id WHEN :id_0 THEN :myfield1val_0 WHEN :id_1 THEN :myfield1val_1 END,myfield2 = CASE id WHEN :id_0 THEN :myfield2val_0 WHEN :id_1 THEN :myfield2val_1 END WHERE id IN (:id_1,:id_2);array (size=6) ':id_0' => int 1 ':myfield1val_0' => int 11 ':id_1' => int 2 ':myfield1val_1' => int 22 ':myfield1va2_0' => int 111 ':myfield1va2_1' => int 222

另外三种批量更新方式

1. replace into 批量更新

replace into mytable(id, myfield) values (1,'value1'),(2,'value2'),(3,'value3');

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

insert into mytable(id, myfield1, myfield2) values (1,'value11','value21'),(2,'value12','value22'),(3,'value13','value23') on duplicate key update myfield1=values(myfield2),values(myfield2)+values(id);

3. 临时表

DROP TABLE IF EXISTS `tmptable`;create temporary table tmptable(id int(4) primary key,myfield varchar(50));insert into tmptable values (1,'value1'),(2,'value2'),(3,'value3');update mytable, tmptable set mytable.myfield = tmptable.myfield where mytable.id = tmptable.id;
  1. 【replace into】和【insert into】更新都依赖于主键或唯一值,并都可能造成新增记录的操作的结构隐患
  2. 【replace into】操作本质是对重复记录先delete然后insert,如果更新的字段不全缺失的字段将被设置成缺省值
  3. 【insert into】则只是update重复的记录,更改的字段只能依循公式值
  4. 【临时表】方式需要用户有temporary 表的create 权限
  5.  数量较少时【replace into】和【insert into】性能最好,数量大时【临时表】最好,【CASE】则具有通用型也不具结构隐患

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


  • 上一条:
    MariaDB 新版本实力逆袭不仅仅是 MySQL 替代品
    下一条:
    远程连接mysql错误代码1130的解决方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客