我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql 自增主键回溯的坑

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql 自增主键回溯的坑

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql 自增主键回溯的坑

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

下载Word文档

猜你喜欢

Mysql 自增主键回溯的坑

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

MySQL主键自增会遇到的坑及解决方法

目录1. 为什么不用 UUID2. 主键自增的问题2.1 数据插入的三种形式2.2 innodb_autoinc_lock_mode2.3 实践3. 小结在上篇文章中,松哥和小伙伴们分享了 mysql 的聚簇索引,也顺便和小伙伴们分析了为什
2023-04-20

mybatis怎么返回自增主键

MyBatis可以通过设置useGeneratedKeys属性来返回自增主键。具体步骤如下:1. 在Mapper的insert语句中添加useGeneratedKeys="true"和keyProperty属性,示例:```xml```其中
2023-08-24

mysql主键自增命令

mysql 的主键自增命令使用 auto_increment 属性,可以为表创建主键并使其自动递增,语法为 create table table_name (id int not null auto_increment, ... 其他列定义
mysql主键自增命令
2024-08-01

mysql如何插入时返回自动增长的主键

主键为id insert into ims_user_guide( userstatus, name, onboarddate ) values( 0, #{name} now(), )
mysql如何插入时返回自动增长的主键
2020-05-17

mysql主键自增怎么写

在 mysql 中配置主键自增只需两步:1. 创建表时指定主键并使用 primary key 关键字;2. 使用 alter table 命令修改主键列,并指定 auto_increment 属性以自动增加主键值。如何在 MySQL 中配置
mysql主键自增怎么写
2024-04-22

mysql自增主键如何设置

mysql 中设置自增主键的方法包括:创建表时指定(create table... auto_increment)、表创建后添加(alter table... primary key)。自增主键具有唯一性、自动生成和高性能的特点,但也需要考
mysql自增主键如何设置
2024-06-15

mysql怎么设置主键自增

在MySQL中,可以通过以下步骤来设置主键自增:创建表时在定义主键字段的时候,可以使用AUTO_INCREMENT来指定主键自增。示例:CREATE TABLE my_table (id INT NOT NULL AUTO_INCREME
mysql怎么设置主键自增
2024-04-12

mysql主键怎么设置自增

mysql 中设置自增主键的步骤:创建表时,在主键列上使用 auto_increment 关键字。插入数据时,无需指定主键值,mysql 将自动生成递增值。可使用 last_insert_id() 函数检索最近插入的自增值。自增主键仅适用于
mysql主键怎么设置自增
2024-04-22

mysql主键自增如何设置

在MySQL中,可以使用AUTO_INCREMENT关键字来设置主键自增。具体步骤如下:创建表时,在定义主键字段的语句中,使用AUTO_INCREMENT关键字来指定该字段为自增主键。例如:CREATE TABLE table_name (
mysql主键自增如何设置
2024-04-22

mysql怎么添加自增主键

在MySQL中,可以通过创建表时使用`AUTO_INCREMENT`关键字来添加自增主键。以下是一个示例:```sqlCREATE TABLE table_name (id INT PRIMARY KEY AUTO_INCREMENT,co
2023-08-31

MySQL补充——获取自增主键的下一个自增值

本文主要学习了如何获得自增主键的下一个值。 MySQL补充——获取自增主键的下一个自增值摘要:本文主要学习了如何获得自增主键的下一个值。格式1 select auto_increment from information_schema.table
MySQL补充——获取自增主键的下一个自增值
2017-05-27

编程热搜

目录