[Mysql]使用on duplicate key update引起主键不连续自增

1,198 阅读1分钟

前言

最近因为家里一些事情,一些变故断更好几天; 后面坚持拿到这个月奖励

本文来自本人之前写的:blog.csdn.net/pmdream/art…

内容

 因为在定时任务里面,把mysql的一个表当做缓存来用;

所以就需要update + insert的操作;

如果不需要主键还好,但是因为公司要求最好是有主键的(自增id)

当然用自增id也是有很多好处的(1.方便范围查询 2. 相同范围的数据,大概率会分配在一个数据页上面 3. 减少页分裂的次数 4. 数字型,容易排序,而且占得空间小 5.在数据同步的场景中,自增id的好处比较突出,可以很好地使用waterdrop 进行分片等)

现象呢:

当然,这边有个bug,导致我某些记录频繁的进行更新;

所以就成这样子了;

所以解决方式是 先更新,看看影响的行数,如果大于等于1,那么更新成功,否则就进行插入操作;

之前写法:

<insert id="upsert" parameterType="java.util.List">
  insert into xxx_status_desc (
  project_id, type, status, status_desc,is_deleted, update_time
  )
  values
  <foreach collection="list" item="item" separator=",">
    (#{projectId},#{type},#{item.status},#{item.statusDesc}, 0, NOW())
  </foreach>
  ON DUPLICATE KEY UPDATE
  status_desc = VALUES(status_desc),
  is_deleted = VALUES(is_deleted)
</insert>

那么接下来就分解为 update 和insert~ 代码不过多赘述;