广告
返回顶部
首页 > 资讯 > 数据库 >Mysql 自增主键回溯的坑
  • 258
分享到

Mysql 自增主键回溯的坑

摘要

使用Mysql的时候,很多时候用自增主键。正常使用一般是没有问题的,但是极小概率情况下会碰到主键回溯的问题。在业务上可能造成id一样,但是对应的业务数据不一样的问题。这个问题发生在mysql 8.0版本之前。 出现场景: 插入一条数据返回主

Mysql 自增主键回溯的坑[数据库教程]

使用Mysql的时候,很多时候用自增主键。正常使用一般是没有问题的,但是极小概率情况下会碰到主键回溯的问题。在业务上可能造成id一样,但是对应的业务数据不一样的问题。这个问题发生在mysql 8.0版本之前。

出现场景: 插入一条数据返回主键3, 接着删除了主键为3的数据,这个时候突然数据库宕机了,重启之后再进行插入,返回的主键还是3。正常这个时候应该是返回主键4的,与预期不一致,对业务数据会造成不一致。

模拟场景
1、建一张表:

mysql> CREATE TABLE t (
    ->      a INT AUTO_INCREMENT PRIMARY KEY,
    ->      b VARCHAR(255) default null
    ->  );
Query OK, 0 rows affected (0.03 sec)

2, 插入数据:

mysql> insert into t(`b`) values (‘xxx‘),(‘yyy‘),(‘zzz‘);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

3, 查看插入的数据

mysql> select * from t;
+---+------+
| a | b    |
+---+------+
| 1 | xxx  |
| 2 | yyy  |
| 3 | zzz  |
+---+------+
3 rows in set (0.00 sec)

4, 删除主键为3的数据

mysql> delete from t where a=3;
Query OK, 1 row affected (0.01 sec)

5,这个时候如果直接插入数据,返回的主键是4,这是正常的行为。但是如果这个时候突然宕机了,重启再插入数据,返回的主键还是3。这里只模拟异常情况,将mysql服务器重启,然后再插入数据。

mysql> insert into t (`b`) values (‘new_line‘);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+---+----------+
| a | b        |
+---+----------+
| 1 | xxx      |
| 2 | yyy      |
| 3 | new_line |
+---+----------+
3 rows in set (0.00 sec)

可以看到刚插入的数据,主键还是3。

原因解释: MySQL 8.0 版本前,自增不持久化,数据库重启时会发生主键回溯。
解决方法

  • 升级 MySQL 版本到 8.0 版本,每张表的自增值会持久化;
  • 若无法升级数据库版本,则强烈不推荐在核心业务表中使用自增数据类型做主键。

造成影响:如果前端插入一条user的数据,返回给前端一个id,这个时候如果有客户端删除了这个id对应的数据,刚好宕机,重启后又插入一条新的user数据,那么会覆盖掉之前的user。这是非常严重的业务数据错乱,造成生产事故的。

Mysql 自增主键回溯的坑

原文:https://www.cnblogs.com/xstar-WEBsite/p/14987476.html

您可能感兴趣的文档:

--结束END--

本文标题: Mysql 自增主键回溯的坑

本文链接: https://www.lsjlt.com/news/8564.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql 自增主键回溯的坑
    使用mysql的时候,很多时候用自增主键。正常使用一般是没有问题的,但是极小概率情况下会碰到主键回溯的问题。在业务上可能造成id一样,但是对应的业务数据不一样的问题。这个问题发生在Mysql 8.0版本之前。 出现场景: 插入一条数据返回主...
    99+
    2017-04-29
    Mysql 自增主键回溯的坑 数据库入门 数据库基础教程
  • MySQL数据库auto_increment自增值回溯
    本篇内容介绍了“MySQL数据库auto_increment自增值回溯”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够...
    99+
    2022-10-18
  • MySQL主键自增会遇到的坑及解决方法
    目录1. 为什么不用 UUID2. 主键自增的问题2.1 数据插入的三种形式2.2 innodb_autoinc_lock_mode2.3 实践3. 小结在上篇文章中,松哥和小伙伴们分享了 mysql 的聚簇索引,也顺便...
    99+
    2023-04-20
    MySQL主键自增 MySQL主键
  • MySQL主键自增的原因
    MySQL主键自增的原因?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!InnoDB引擎表的特点1、InnoDB引擎表是基于...
    99+
    2022-10-18
  • mybatis怎么返回自增主键
    MyBatis可以通过设置useGeneratedKeys属性来返回自增主键。具体步骤如下:1. 在Mapper的insert语句中...
    99+
    2023-08-24
    mybatis
  • mysql如何插入时返回自动增长的主键
    主键为id insert into ims_user_guide( userstatus, name, onboarddate ) values( 0, #{name} now(),...
    99+
    2020-05-17
    mysql如何插入时返回自动增长的主键 数据库入门 数据库基础教程 数据库 mysql
  • 详解MySQL自增主键的实现
    目录一、自增值保存在哪儿?二、自增值修改机制三、自增值的修改时机四、自增锁的优化五、自增主键用完了一、自增值保存在哪儿? 不同的引擎对于自增值的保存策略不同 1.MyISAM引擎的自...
    99+
    2022-11-12
  • mysql怎么添加自增主键
    在MySQL中,可以通过创建表时使用`AUTO_INCREMENT`关键字来添加自增主键。以下是一个示例:```sqlCREATE ...
    99+
    2023-08-31
    mysql
  • Mysql 自增主键设置以及重置自增值
    一、自增主键设置 CREATE TABLE `table_name` (`IncreaseId` INT(16) NOT NULL AUTO_INCREMENT COMMENT '自增主键',`InsertTime` DATETIME NO...
    99+
    2023-09-03
    mysql 数据库 sql
  • MySQL数据库——MySQL AUTO_INCREMENT:主键自增长
    在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 通过给字段添加 AUTO_INCREMENT 属性来实现主键自增长。语法格式如...
    99+
    2023-09-02
    数据库 mysql sql
  • MySQL补充——获取自增主键的下一个自增值
    本文主要学习了如何获得自增主键的下一个值。 MySQL补充——获取自增主键的下一个自增值 摘要:本文主要学习了如何获得自增主键的下一个值。 格式 1 select auto_incremen...
    99+
    2017-05-27
    MySQL补充——获取自增主键的下一个自增值
  • MySQL中的主键自增机制详情
    目录主键自增自增主键保存在哪里自增值修改机制自增值的修改时机如何修改自增主键值主键自增 mysql 提供了主键自增机制 AUTO_INCREMENT. 对主键使用, 保证了主键的唯一性. 注意:自增长必须与主键字段配合使...
    99+
    2022-08-26
  • 删除mysql中自增主键的方法
    小编给大家分享一下删除mysql中自增主键的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!删除mysql中的自增主键的方法:首先需要删除auto_increment;然后执行【alter ...
    99+
    2022-10-18
  • MySQL中自增主键的示例分析
    这篇文章主要介绍了MySQL中自增主键的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、自增值保存在哪儿?不同的引擎对于自增值的保...
    99+
    2022-10-18
  • MySQL中的自增主键怎么修改
    这篇文章主要介绍“MySQL中的自增主键怎么修改”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL中的自增主键怎么修改”文章能帮助大家解决问题。一、自增值保存...
    99+
    2022-10-19
  • Spring JDBC新增记录怎么返回自增主键值
    本篇内容主要讲解“Spring JDBC新增记录怎么返回自增主键值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring JDBC新增记录怎么返回自增主键值”吧!在JDBC3.0规范中,当新...
    99+
    2023-06-05
  • Mysql主键UUID和自增主键的区别及优劣分析
    引言 之前有段时间用postgresql 数据库,在上云之后,从自增主键变为uuid,感觉uuid全球唯一,很方便。 最近用mysql,发现mysql主键都是选择自增主键,仔细比较一下,为什么mysql选择自增主键,...
    99+
    2022-06-01
    Mysql 主键UUID 自增主键
  • MySql手动获取自增主键的方法
    小编给大家分享一下MySql手动获取自增主键的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql手动获取自增主键的方法...
    99+
    2022-10-18
  • 解决mysql的int型主键自增问题
    引入 我们在使用mysql数据库时,习惯使用int型作为主键,并设置为自增,这既能够保证唯一,使用起来又很方便,但int型的长度是有限的,如果超过长度怎么办呢? 暴露问题 我们先创建...
    99+
    2022-11-12
  • mysql 中怎么实现主键自增长
    这篇文章将为大家详细讲解有关mysql 中怎么实现主键自增长,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。mysql表主键自增长的sql语句1、不控制主键的...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作