当前位置: 首页 > news >正文

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

首先mysql更新数据的某个字段,一般这样写:

?1UPDATE mytableSET myfield ='value' WHERE other_field ='other_value';

也可以这样用in指定要更新的记录:

?1UPDATE mytableSET myfield ='value' WHERE other_fieldin ('other_values');

这里注意 ‘other_values' 是一个逗号(,)分隔的字符串,如:1,2,3

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

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

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

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

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

?UPDATE mytableSET myfield =CASE idWHEN 1THEN 'myvalue1'WHEN 2THEN 'myvalue2'WHEN 3THEN 'myvalue3'ENDWHERE other_field ('other_values')

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

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

?UPDATE mytableSET myfield1 =CASE idWHEN 1THEN 'myvalue11'WHEN 2THEN 'myvalue12'WHEN 3THEN 'myvalue13'END,myfield2 =CASE idWHEN 1THEN 'myvalue21'WHEN 2THEN 'myvalue22'WHEN 3THEN 'myvalue23'ENDWHERE idIN (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.";
";

输出:

?1UPDATE 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.";
";var_dump($params);

输出:

?UPDATE mytableSET myfield1 =CASE idWHEN :id_0THEN :myfield1val_0WHEN :id_1THEN :myfield1val_1END,myfield2 =CASE idWHEN :id_0THEN :myfield2val_0WHEN :id_1THEN :myfield2val_1END WHERE idIN (: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 批量更新

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

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

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

3. 临时表

?1234DROP TABLE IF EXISTS `tmptable`;create temporary table tmptable(idint(4)primary key,myfieldvarchar(50));insert into tmptablevalues (1,'value1'),(2,'value2'),(3,'value3');update mytable, tmptableset mytable.myfield = tmptable.myfieldwhere mytable.id = tmptable.id;【replace into】和【insert into】更新都依赖于主键或唯一值,并都可能造成新增记录的操作的结构隐患

【replace into】操作本质是对重复记录先delete然后insert,如果更新的字段不全缺失的字段将被设置成缺省值

【insert into】则只是update重复的记录,更改的字段只能依循公式值

【临时表】方式需要用户有temporary 表的create 权限

数量较少时【replace into】和【insert into】性能最好,数量大时【临时表】最好,【CASE】则具有通用型也不具结构隐患

总结

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

相关文章:

  • mysql win7 解压 安装_Win7x64下Mysql5.7.18解压版的安装方法
  • mysql undo损坏_记一次redo和undo的损坏问题
  • mysql 定位进程_多进程编程mysql超时定位
  • 通过接口返回对方信息_真的可以通过手机号码,准确定位对方信息吗?
  • 定义string变量 需要哪些头文件_7.3 C++字符串类 | 使用string输出
  • mac下安装mysql 5.7.11卡住_Mac 安装mysql5.7 注意事项
  • mysql 5.5基本语句_MySql___(5) MySQL 必知必会
  • Mysql什么版本支持组提交_MYSQL组提交
  • mysql纵列改成恒列_php-如何将mysql表行显示为列
  • mysql ssl 2026_解决连接到 Amazon RDS for MySQL 或 Aurora 实例时的 ERROR 2026 SSL 连接错误...
  • opensuse rpm安装mysql_rpm安装MySQL
  • 顺序表的基本操作_顺序表基本操作上机实验
  • lede软路由Mysql未运行_Proxmox VE(PVE)安装LEDE/OpenWrt 软路由系统|虚拟机环境
  • mysql的awr生成语句_如何生成指定SQL语句的AWR报表
  • mysql对建表语句长度的限制_MySQL 建表字段长度的限制
  • 分享的文章《人生如棋》
  • 【刷算法】求1+2+3+...+n
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • canvas绘制圆角头像
  • Iterator 和 for...of 循环
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • js数组之filter
  • js学习笔记
  • miaov-React 最佳入门
  • mockjs让前端开发独立于后端
  • node-glob通配符
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Rancher如何对接Ceph-RBD块存储
  • React as a UI Runtime(五、列表)
  • use Google search engine
  • XML已死 ?
  • 给初学者:JavaScript 中数组操作注意点
  • 欢迎参加第二届中国游戏开发者大会
  • 区块链共识机制优缺点对比都是什么
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 事件委托的小应用
  • 双管齐下,VMware的容器新战略
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 移动端 h5开发相关内容总结(三)
  • 用简单代码看卷积组块发展
  • 自动记录MySQL慢查询快照脚本
  • # 飞书APP集成平台-数字化落地
  • (33)STM32——485实验笔记
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (二)JAVA使用POI操作excel
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (力扣)循环队列的实现与详解(C语言)
  • (南京观海微电子)——I3C协议介绍
  • (五)c52学习之旅-静态数码管
  • .Family_物联网
  • .NET 8.0 中有哪些新的变化?
  • .net 生成二级域名
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET与java的MVC模式(2):struts2核心工作流程与原理