在做数据统计的时候,我们经常会用到mysql的on duplicate key update语法来自动更新数据,比如

最近项目上需要实现这么一个功能:统计每个人每个软件的使用时长,客户端发过来消息,如果该用户该软件已经存在增更新使用时间,如果没有则新添加一条记录,代码如下:

<update  id="saveOrUpdate"  parameterType="java.util.List">  <foreach collection="appList" item="item" index="index"  separator=";">  insert into app_table(userName,app,duration) values(#{userName},#{item.app},#{item.duration}) on duplicate key update duration=duration+#{item.duration}  </foreach>
</update>  

使用on duplicate key update语法有时是很方便,但是会有一个影响:默认情况下,每次更新都会更新该表的自增主键ID,如果更新频率很快,会导致主键ID自增的很快,过段时间就超过数字类型的的范围了

解决这个问题,有两种方式:

方法一:拆分成两个动作,先查询,再更新

方法二:修改innodb_autoinc_lock_mode参数(不推荐)
  innodb_autoinc_lock_mode中有3种模式,0,1,2,数据库默认是1的情况下,就会发生上面的那种现象,每次使用insert into .. on duplicate key update 的时候都会把简单自增id增加,不管是发生了insert还是update

innodb_autoinc_lock_mode参数详解

  • tradition(innodb_autoinc_lock_mode=0) 模式:

1、它提供了一个向后兼容的能力
2、在这一模式下,所有的insert语句("insert like") 都要在语句开始的时候得到一个表级的auto_inc锁,在语句结束的时候才释放这把锁,注意呀,这里说的是语句级而不是事务级的,一个事务可能包涵有一个或多个语句。
3、它能保证值分配的可预见性,与连续性,可重复性,这个也就保证了insert语句在复制到slave的时候还能生成和master那边一样的值(它保证了基于语句复制的安全)。
4、由于在这种模式下auto_inc锁一直要保持到语句的结束,所以这个就影响到了并发的插入。

  • consecutive(innodb_autoinc_lock_mode=1) 模式:

1、这一模式下去simple insert 做了优化,由于simple insert一次性插入值的个数可以立马得到确定,所以mysql可以一次生成几个连续的值,用于这个insert语句;总的来说这个对复制也是安全的(它保证了基于语句复制的安全)
2、这一模式也是mysql的默认模式,这个模式的好处是auto_inc锁不要一直保持到语句的结束,只要语句得到了相应的值后就可以提前释放锁

  • interleaved(innodb_autoinc_lock_mode=2) 模式

1、由于这个模式下已经没有了auto_inc锁,所以这个模式下的性能是最好的;但是它也有一个问题,就是对于同一个语句来说它所得到的auto_incremant值可能不是连续的。



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548

MySQL使用on duplicate key update时导致主键不连续自增相关推荐

  1. mysql duplicate id_mysql 使用ON DUPLICATE KEY UPDATE 时导致的自增主键id无限增大问题

    mysql 版本:5.7 python版本:3.7 问题描述:mysql表A中数据有几十条,设置了一个自增 1 的id作为主键,在程序运行一段时间后发现表中最后一条数据的id已经是几百万了 表中所有数 ...

  2. MySQL于ON DUPLICATE KEY UPDATE采用

    今天我们做的推断插入用途MySQL于ON DUPLICATE KEY UPDATE.现在,Mark下面! 假设你想做的事,再有就是在数据库中插入数据没有数据.如果有数据更新数据,然后你可以选择ON D ...

  3. MySQL主键自增长报duplicate_MySQL使用on duplicate key update引起主键不连续自增

    innodb_autoinc_lock_mode中有3种模式,0,1,2,数据库默认是1的情况下,每次使用insert into - on duplicate key update 的时候都会把简单自 ...

  4. 【MySQL】ON DUPLICATE KEY UPDATE 解决重复插入问题

    参考文章:mysql "ON DUPLICATE KEY UPDATE" 语法 ON DUPLICATE KEY UPDATE 开发过程中,可能会遇到这样的需求,先判断某一记录是否 ...

  5. MYSQL中ON DUPLICATE KEY UPDATE对数据进行insertOrUpdate操作

    本文来自:高爽|Coder,原文地址:[url]http://blog.csdn.net/ghsau/article/details/23557915[/url],转载请注明. 向数据库插入记录时,有 ...

  6. MySQL中 ON DUPLICATE KEY UPDATE语法的使用

    MySQL ON DUPLICATE KEY UPDATE 为Mysql特有语法 ON DUPLICATE KEY UPDATE 用法与说明 Mysql中INSERT ... ON DUPLICATE ...

  7. mysql批量更新,批量插入之replace语句/insert into... on duplicate key update语句

    mysql批量更新/插入数据有以下方法,使用这些方法批量插入数据/更新数据的时候就不用在代码层次增加判断数据是否已存在的逻辑了. 1:replace语句 2: insert into... on du ...

  8. MySQL 当记录不存在时insert,当记录存在时update(ON DUPLICATE KEY UPDATE, REPLACE语句)...

    MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法. 第一种:示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语 ...

  9. MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)

    本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,各位同学可尝试参考. 案一:使用ignore ...

最新文章

  1. mrp软件Java模拟器下载_mrp模拟器
  2. Hadoop源代码分析 - MapReduce(转载)
  3. codeforces 450B. Jzzhu and Sequences 解题报告
  4. SVM中为何间隔边界的值为正负1
  5. 关于雅可比迭代的Python实现
  6. linux的crontab监控,通过crontab自动监测与管理表空间
  7. 高级转录组分析和R数据可视化第十一期(报名线上课还可免费参加线下课)
  8. redis命令大全参考手册
  9. 2,上传电影,udp,异常处理,socketserver
  10. Python使用for循环打印九九乘法表
  11. SQL Sever — 上课笔记【主键、外键、唯一性约束、检查约束】
  12. 网页授权前端 java_在开发网页授权获取用户基本信息时code是null
  13. 小白的程序员自学之路
  14. 实力破解机器学习的秘密
  15. 如何制作启动U盘安装系统?
  16. 智能手表产业迎来潜在的市场空间
  17. Java服务端和客户端开发辅助工具Utils
  18. LaTeX--简易教程--论文写作神器
  19. aria服务器没有响应,aria2服务器错误
  20. 如何解决网站大流量和高并发问题?

热门文章

  1. mysql编译卡主_mysql 编译安装以及主从设定
  2. python cnn_Python · CNN(一)· 层结构
  3. 绵阳python培训_《绵》原文及翻译海绵翻译
  4. java中负数取整_Java取整,固定保留两位小数,适配负数、金融数字。
  5. socketserver 源码浅读
  6. 牛客网编程练习之编程马拉松:解读密码
  7. String ua = request.getHeader(user-agent)---ua值为null
  8. 第二阶段个人工作总结04
  9. cuda-convnet在Ubuntu12.04+CUDA5.5下的配置
  10. [经典推荐]事半功倍系列之javascript