首页 > 数据库 >ON DUPLICATE KEY UPDATE 导致mysql自增主键ID跳跃增长

ON DUPLICATE KEY UPDATE 导致mysql自增主键ID跳跃增长

时间:2022-12-09 17:22:44浏览次数:44  
标签:insert 自增 update UPDATE DUPLICATE mysql 主键

一. 问题点:

1. 如果mysql表只是设置了联合主键且不包含自增的id, 则使用ON DUPLICATE KEY UPDATE不会有问题

2. 如果mysql表设置了自增主键id, 则使用ON DUPLICATE KEY UPDATE可能会造成自增id跳跃增长

二. 解决:

1、从项目代码逻辑出发

可以改变代码逻辑,变成先执行update方法,然后判断返回值是否等于0,如果返回值等于0则证明没有数据变动,否则执行insert方法。

 

这样可以解决问题,但是从之前的一次sql变为了两次,会导致效率低下。 

2、从问题出发:ON DUPLICATE key update会在update时主键也会自增+1

首先需要在配置中支持多条sql语句执行, 默认为false,这里需要改为true:

然后在insert之前增加一条sql语句

设置完之后就可以解决ON DUPLICATE key update会在update时主键也会自增+1这个问题了,但是这样每次在执行这个sql时都会调用alter table wss_production_model auto_increment=1,这样也会导致效率会变低。

3、从Mysql配置出发

修改innodb_autoinc_lock_mode配置

innodb_autoinc_lock_mode中有3种模式, 0、1、2, mysql默认为1,

0:每次分配自增id的时候都会锁表,这个对并发不太支持
1:只有在bulk insert的时候才会锁表,简单insert的时候只会使用一个light-weight mutex,比0的并发性能高
2:很多不保证,不太安全,不建议使用

修改为0则可以解决问题,然而修改完后会导致在高并发下效率低下,而且线上数据库和本地数据库的配置要同步,这里不推荐使用这种方法。

三. 总结

具体解决方案可以根据项目来选择,如果项目不大,可以考虑1和2。如果不考虑高并发问题,可以考虑3。

标签:insert,自增,update,UPDATE,DUPLICATE,mysql,主键
From: https://www.cnblogs.com/Baker-Street/p/16969512.html

相关文章

  • You may have an infinite update loop in a component render function.报错解决办法
    报错本例在computed中进行修改data里的数据时发生的错误Youmayhaveaninfiniteupdateloopinacomponentrenderfunction.原因data中的数据一直处于监听状态,因......
  • 获取插入后的自增主键值
    昨天有一个需求想数据库插入数据的同时返回自增主键的值 手动写sql 不用mybatisplus的方法<insertid="insertMenu"parameterType="resMenu"useGeneratedKeys="tru......
  • JavaScript:操作符:正负号和自增自减及其隐式转换
    正负号正号即加号,负号即减号,运算结果同数学意义一样;对非数字类型进行正负号运算,会隐式转换为数字,再进行运算;一些特殊的非数字,转换情况同算术运算符;自增自减自增即为++......
  • 使用TWEEN.js时update更新发现初始点位全部变成NaN
    在只用tween时只要执行了update方法就会发现传入的点变为NaN,从而导致模型消失console.log(t.target,t.paras);tw=newTWEEN.Tween(t.paras).to(t.target,d)......
  • Twitter的分布式自增ID雪花算法snowflake (Java版)
    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用......
  • 联合主键与自动建表
    当你使用了两个@Id的时候,就一定要使用jpa的联合主键方法规范,注:实体类不会限制@Id的数量写一万个也不会报错@Entity@Table(name="download_info_notid")@IdClass(Down......
  • ShardingCore兼容Code-First数据库迁移 让update-database能更新分表
    参考文章.Net下极限生产力之分表分库全自动化MigrationsCode-First背景在我上一篇博客ABPEFCORE7集成ShardingCore实现分表写完之后,我发现我还有一个没解决的问......
  • Mybatis-Plus主键生成策略详解
    文章目录​​前言​​​​一、官网​​​​二、主键注解@TableId说明​​​​1、源码​​​​2、作用​​​​3、使用​​​​三、主键生成策略-IdType枚举说明​​​​1、......
  • MySQL主键自增
    1.查看自增值SELECTAuto_incrementFROMinformation_schema.TABLESWHERETable_Schema='database'ANDtable_name='tableName'2.设置自增值altertable......
  • Mybatis-Plus中updateById方法不能更新空值问题
    问题描述在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的。而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况。那么如果让Mybat......