java批量修改数据库数据_sql批量更新多条数据

java批量修改数据库数据_sql批量更新多条数据批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:代码如下:UPDATEmytableSETmyfield=’value’WHEREother_field=’other_value’;如果更新同一字段为同一个值,mysql也很简单,修改下where即可:代码如下:UPDATEmytableSETmyfield=’value’WHEREother_…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

批量更新

mysql更新语句很简单,更新一条数据的某个字段,一般这样写:

代码如下:

UPDATE mytable SET myfield = ‘value’ WHERE other_field = ‘other_value’;

如果更新同一字段为同一个值,mysql也很简单,修改下where即可:

代码如下:

UPDATE mytable SET myfield = ‘value’ WHERE other_field in (‘other_values’);

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

那如果更新多条数据为不同的值,可能很多人会这样写:

代码如下:

foreach ($display_order as $id => $ordinal) {

$sql = “UPDATE categories SET display_order = $ordinal WHERE id = $id”;

mysql_query($sql);

}

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

那么能不能一条sql语句实现批量更新呢?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

代码如下:

UPDATE mytable

SET myfield = CASE id

WHEN 1 THEN ‘value’

WHEN 2 THEN ‘value’

WHEN 3 THEN ‘value’

END

WHERE id IN (1,2,3)

这里使用了case when 这个小技巧来实现批量更新。

举个例子:

代码如下:

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)

这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。

即是将条件语句写在了一起。

这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

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

代码如下:

UPDATE categories

SET display_order = CASE id

WHEN 1 THEN 3

WHEN 2 THEN 4

WHEN 3 THEN 5

END,

title = CASE id

WHEN 1 THEN ‘New Title 1’

WHEN 2 THEN ‘New Title 2’

WHEN 3 THEN ‘New Title 3’

END

WHERE id IN (1,2,3)

到这里,已经完成一条mysql语句更新多条记录了。

但是要在业务中运用,需要结合服务端语言,这里以php为例,构造这条mysql语句:

代码如下:

$display_order = array(

1 => 4,

2 => 1,

3 => 2,

4 => 3,

5 => 9,

6 => 5,

7 => 8,

8 => 9

);

$ids = implode(‘,’, array_keys($display_order));

$sql = “UPDATE categories SET display_order = CASE id “;

foreach ($display_order as $id => $ordinal) {

$sql .= sprintf(“WHEN %d THEN %d “, $id, $ordinal);

}

$sql .= “END WHERE id IN ($ids)”;

echo $sql;

这个例子,有8条记录进行更新。代码也很容易理解,你学会了吗

性能分析

当我使用上万条记录利用mysql批量更新,发现使用最原始的批量update发现性能很差,将网上看到的总结一下一共有以下三种办法:

1.批量update,一条记录update一次,性能很差

代码如下:

update test_tbl set dr=’2′ where id=1;

2.replace into 或者insert into …on duplicate key update

代码如下:

replace into test_tbl (id,dr) values (1,’2′),(2,’3′),…(x,’y’);

或者使用

代码如下:

insert into test_tbl (id,dr) values  (1,’2′),(2,’3′),…(x,’y’) on duplicate key update dr=values(dr);

3.创建临时表,先更新临时表,然后从临时表中update

代码如下 复制代码

create temporary table tmp(id int(4) primary key,dr varchar(50));

insert into tmp values  (0,’gone’), (1,’xx’),…(m,’yy’);

update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id;

注意:这种方法需要用户有temporary 表的create 权限。

下面是上述方法update 100000条数据的性能测试结果:

逐条update

real    0m15.557s

user    0m1.684s

sys    0m1.372s

replace into

real    0m1.394s

user    0m0.060s

sys    0m0.012s

insert into on duplicate key update

real    0m1.474s

user    0m0.052s

sys    0m0.008s

create temporary table and update:

real    0m0.643s

user    0m0.064s

sys    0m0.004s

就测试结果来看,测试当时使用replace into性能较好。

replace into  和insert into on duplicate key update的不同在于:

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

insert into 则是只update重复记录,不会改变其它字段。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234138.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图片中加入超链接html代码,html网页超链接代码 怎样用HTML代码在图片插入超链接…

    图片中加入超链接html代码,html网页超链接代码 怎样用HTML代码在图片插入超链接…HTML使用定义锚创造链接,可用于文本,图片,HTML元素……一,将文本作为超链接文本二,将图像作为超链接三,将书签作为超链接(在网页上显示的)书签文本①在同文档中创建指向该锚的链接。文本②在其他页面创建指向该锚的链接。我有两个html文件在同一个文件夹里。一个index.一个page、如果我要在iHTML超链接可以用a标签来设置。新建html文档,在body标签中添加a标…

    2022年7月26日
  • 极速pdf文件打印时此计算机未连接到网络,PDF文件不能打印的五种解决方案[通俗易懂]

    极速pdf文件打印时此计算机未连接到网络,PDF文件不能打印的五种解决方案[通俗易懂]原标题:PDF文件不能打印的五种解决方案有时我们会发现有些PDF文档虽然能够正常打开,点击打印缺没有反应,是打印机坏了吗?当然不是,PDF不能打印90%是被加密,想要正常重新打印其实很简单。方式一:用老版PDF阅读器不常用也是比较难实现一种解决方法,PDF防打印只是设置了个标志位,大多数PDF软件都遵循这个标准,但用某些老版本的PDF阅读器,就会发现它不支持“禁止打印”“禁止复制”的…

    2022年5月25日
  • maven配置阿里云仓库镜像[通俗易懂]

    maven配置阿里云仓库镜像[通俗易懂]全局配置修改settting文件在mirrors标签下添加子节点。<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexusaliyun</name>…

    2022年6月18日
  • Java——数组的定义与使用「建议收藏」

    Java——数组的定义与使用「建议收藏」目录1.数组2.数组初始化2.1动态初始化(声明并开辟数组)2.2引用传递的内存分析2.3静态初始化(开辟同时赋值)3.二维数组4.数组与方法互操作5.Java对数组的支持5.1排序:5.2拷贝6.对象数组6.1动态初始化1.数组一组相关类型的变量集合缺点:长度固定,存在越界问题2.数组初始化 2.1动态初始化…

    2022年5月22日
  • linux平均负载什么意思_负荷率和负载率一样吗

    linux平均负载什么意思_负荷率和负载率一样吗1,Linux系统的平均负载是什么?特定时间间隔内运行队列中的平均进程数,好象还不够明白:就是进程队列的长度,有多少个进程在排队等待运行2,什么是”进程队列”?一个进程满足以下条件就会位于进程队列中1,它没有在等待I/O操作的结果2,它没有主动进入等待状态(即没有调用wait)3,它没有被停止3,如何查看平均负载?最简单的命令是uptime例子:[www.linuxidc.com@localho…

    2022年9月2日
  • 在 vscode 中使用 Git :拉取、提交、克隆

    在 vscode 中使用 Git :拉取、提交、克隆PS:转载此文后,网友在评论中提到还有其它方法,不过目前个人尚在研究中,有兴趣的朋友们也可自行一探究竟…————————————————————————-1、将代码放到码云到码云里新建一个仓库,完成后码云会有一个命令教程按上面的来就行了 码云中的使用教程:Git全局设置:…

    2022年6月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号