Mysql Update批量更新的几种方式

 更新时间:2019年02月26日 10:40:44   作者:bluexue0724  
今天小编就为大家分享一篇关于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 other_field='other_value'; '''

这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。幸运的是,还有更好的解决方案,只不过SQL语句稍微复杂点,但是只需执行一次查询即可,语法如下:

UPDATE mytable
  SET myfield = CASE other_field
    WHEN 1 THEN 'value'
    WHEN 2 THEN 'value'
    WHEN 3 THEN 'value'
  END
WHERE id IN (1,2,3)

这样的SQL语句是很容易理解的,也就是用到了很多编程语言都有的关键字 CASE,根据id字段值来进行不同分支的当型判断,

如果你需要更新一行记录的多个字段,可以用以下SQL语句:

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)

以上方案大大减少了数据库的查询操作次数,大大节约了系统资源

不过这个有个缺点 : 要注意的问题是SQL语句的长度,需要考虑程序运行环境所支持的字符串长度,当然这也可以更新mysql的设置来扩展。

当然python这么强大的语言还给我们提供了executemany 这么强大的方法 ,它不仅可以插入数据 当然也可以用于更新数据 作为一个经常搞事情的人 这些东西要经常相互用下 才可以对比出结果

update_sql = ''' UPDATE mayi_order_image 
set order_city = %s
where user_ip = %s and dt = %s and id = %s 
 and user_ip is not null and (order_city is null or order_city = '' )
 '''
pp = []
for x in xrange(len(result)):
  ip = result[x][0]
  id_ = result[x][1]
  add = dbip.lookup(str(ip))
  adds = add.split('\t')
  address = str(adds[0]) + ','+str(adds[1] )+ ','+ str(adds[2])
  pp.append((address,ip,end,id_))
  if x%5000 == 0:
    saveLog_many(update_sql,pp)
    pp = []
saveLog_many(update_sql,pp)

是不是这个更方便一些 但是吗 速度 问题 我感觉可以和第二种结合一下对比一下会更好呢

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • mysql 有关“InnoDB Error ib_logfile0 of different size”错误

    mysql 有关“InnoDB Error ib_logfile0 of different size”错误

    mysql 有关“InnoDB Error ib_logfile0 of different size”错误的解决方法,需要的朋友可以参考下。
    2011-06-06
  • mysql整数数据类型深入解析

    mysql整数数据类型深入解析

    本篇文章是对mysql中的整数数据类型进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql8.0 lower_case_table_names 大小写敏感设置问题解决

    mysql8.0 lower_case_table_names 大小写敏感设置问题解决

    在默认情况下,这个变量是设置为0的,以保持向前兼容性,如果将该变量设置为1,则表名和数据库名将被区分大小写,本文主要介绍了mysql8.0 lower_case_table_names 大小写敏感设置问题解决,感兴趣的可以了解一下
    2023-09-09
  • MySQL查看锁表的实现步骤

    MySQL查看锁表的实现步骤

    在MySQL数据库中,当多个事务同时请求对同一行数据进行修改时,就会发生锁表现象,本文主要介绍了MySQL查看锁表的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    安装和使用percona-toolkit来辅助操作MySQL的基本教程

    这篇文章主要介绍了安装和使用percona-toolkit来辅助操作MySQL的基本教程,这里举了五个最常见的命令用法,需要的朋友可以参考下
    2015-11-11
  • MySQL尾部空格处理方法详解

    MySQL尾部空格处理方法详解

    这篇文章主要介绍了MySQL尾部空格处理方法详解的相关资料,通过创建合适的索引来实现区分有尾部空格和没有尾部空格的字符串,需要的朋友可以参考下
    2023-07-07
  • sql ROW_NUMBER()与OVER()方法案例详解

    sql ROW_NUMBER()与OVER()方法案例详解

    这篇文章主要介绍了sql ROW_NUMBER()与OVER()方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 浅谈MySql update会锁定哪些范围的数据

    浅谈MySql update会锁定哪些范围的数据

    本文主要介绍了记录一下MySql update会锁定哪些范围的数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • CentOS7使用rpm包安装mysql 5.7.18

    CentOS7使用rpm包安装mysql 5.7.18

    这篇文章主要为大家详细介绍了CentOS7使用rpm包安装mysql 5.7.18的相关步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 设计性能更优MySQL数据库schema

    设计性能更优MySQL数据库schema

    这篇文章主要介绍了设计性能更优MySQL数据库schema,文章通过数据类型优化展开对主题内容的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论