MySQL8自增主键变化

MySQL8自增主键变化

醉后不知天在水,满船清梦压星河。

一、简述

MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看。

比如系统表引擎的变化-全部换成事务型的InnoDB。

MySQL5.7系统部引擎

MySQL8自增主键变化

MySQL8系统引擎

MySQL8自增主键变化

上图可以看到,MySQL5.7的系统表引擎有MEMORY、InnnoDB和MyISAM三种,但MySQL8的系统表引擎都换成了InnoDB。MySQL8新特性还有很多,接下来进入正题康康它的自增主键。

二、MySQL自增主键

为什么MySQL8新特性会修改自增主键属性?

在MySQL8.0之前,自增主键 AUTO_INCREMENT 的值如果大于max(primary key) +1,那么在MySQL重启后,则会重置 AUTO_INCREMENT = max(primary key)+1 的值,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的一些问题。

MySQL官网解释自增ID冲突问题

MySQL8自增主键变化

因为在MySQL5.7中,对于自增主键的分配规则是由InnoDB数据字典内部一个计数器来决定的,而该计数器维护在了内存中,并不会持久化到磁盘中,此时硬盘中并无数据,当数据库重启的时候,该计数器会被初始化为: auto_increment = max(primary key)+1。

如何解决自增主键冲突问题?

这个问题一直到MySQL8.0才解决。
8.0版本将会对 AUTO_INCREMENT 值进行持久化,所以即使MySQL重启后该值也不会改变。
即其将自增主键的计数器持久化到了重做日志中,每次计数器发生改变都会将其写入到重做日志中,如果这个时候数据库重启了,那么InnoDB数据字典会根据重做日志中的信息来初始化计数器的内存值,就可以恢复到了上次关闭数据库前的状态,通过自增ID持久化来避免8.0之前可能会出现的问题。

三、自增主键测试

分别在MySQL5和MySQL8上进行自增主键测试。

1、MySQL5.7自增主键

在MySQL5.7中的, 这里我们先创建一个数据表,这个数据表中设置一个自增列。

CREATE TABLE t_test_auto_increment_tjt(
  id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  test_key varchar(50) NOT NULL COMMENT '名称',
  test_value varchar(50) DEFAULT NULL COMMENT '值',
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='测试主键自增表';

然后向自增主键表中添加了4条记录,表中的四条添加的记录的id字段值就分别为: 1、2、3、4。

INSERT INTO t_test_auto_increment_tjt(id, test_key, test_value) VALUES
('0','吞噬星空','停更'),
('0','水斗大陆','可以停播了'),
('0','武神主宰','装B还得看尘少'),
('0','完美世界','yyds')

插入数据的SQL添加的是0,其实就是默认赋值,表 t_test_auto_increment_tjt 中的自增列是不可以添加0或者null的,那么这个时候表中的四条添加的记录的id字段值就分别为: 11、2、3、4。

MySQL8自增主键变化

接下来,将表中的id为4的字段删除。

DELETE FROM t_test_auto_increment_tjt WHERE id = 4

然后,继续在表中添加一条记录,执行之后我们可以发现,此时自增主键的ID结果是5。

INSERT INTO t_test_auto_increment_tjt(id, test_key, test_value) VALUES ('0','完美世界','yyds-YYDS')

MySQL8自增主键变化

因为我们前面已经将表中id为4的记录删除了,这个时候下一次自增的时候即使表中没有id为4的字段了,但是这个时候我们也不会添加4,而是添加5。其实这个时候就是自增主键的值auto_increment 大于了max(primary key)+1。
再接下来,将表中的id为5的记录删除。

DELETE FROM t_test_auto_increment_tjt WHERE id = 5

最后,重启MySQL数据库,再向表中添加一条记录。

INSERT INTO t_test_auto_increment_tjt(id, test_key, test_value) VALUES ('0','完美世界','yyds-YYDS-restart')

MySQL8自增主键变化

上图可以看到,重启后 重启后 重启后 执行的结果中添加的记录的id值为 : 4, 按之前的操作来看4和5已经被删除了,那么添加的就应该是6,为什么是4呢?

因为在MySQL5.7中,自增主键的分配规则是由InnoDB数据字典内部一个计数器来决定的,而该计数器维护在了内存中,并不会持久化到磁盘中,此时硬盘中并无数据,当数据库重启之后该计数器会被初始化为: auto_increment = max(primary key)+1,所以记录的id=4,而不是6。

2、MySQL8自增主键

在MySQL8中,按照上述MySQL5.7的操作步骤测试自增主键问题。

首先,创建一个自增主键表,并插入数据。

[En]

First of all, create a self-increasing primary key table and insert data.

MySQL8自增主键变化

然后,删除数据并插入。

[En]

Then, delete the data and insert it.

MySQL8自增主键变化

最后,重启 重启 重启 重启后插入数据。

MySQL8自增主键变化

一定要彻底关闭MySQL服务,然后重新启动。

MySQL8自增主键变化

重启后插入数据,测试自增主键ID的值?

MySQL8自增主键变化

醉后不知天在水

满船清梦压星河

Original: https://www.cnblogs.com/taojietaoge/p/16143104.html
Author: 涛姐涛哥
Title: MySQL8自增主键变化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/505476/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java 百度人脸识别 接口代码

    package org.fh.util; import org.json.JSONObject; import java.io.BufferedReader; import jav…

    数据库 2023年6月6日
    086
  • HTML5基础知识

    作者导言: 引用偶像刘德华的一句话 “学到的就要教人,赚到的就要给人”! 以下是关联的web前端基础知识文章,通过这些文章,您既可以系统地学习和了解这些知识…

    数据库 2023年6月14日
    058
  • City of stars

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16747306.html Or…

    数据库 2023年6月11日
    0104
  • RabbitMQ

    安装Rabbitmq 1.由于需要erlang语言的支持,在安装rabbitMq之前需要安装erlang sudo apt-get install erlang-nox 2.安装r…

    数据库 2023年6月9日
    083
  • 第17章 触发器

    第17章 触发器 在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信&#x…

    数据库 2023年6月6日
    0122
  • 看看你离世界一流大厂有多远?3道Google最新SQL面试题 ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析◉技能提升系列:https://www.showmeai.tech/tutorials/33📘 AI 面试题库系列:https://w…

    数据库 2023年6月14日
    074
  • 当数据库遇到分布式

    NewSQL日渐火热,无论还是开源的TiDB,CockroachDB还是互联网大厂的Spanner,Oceanbase都号称NewSQL,也就是分布式数据库。NewSQL的典型特征…

    数据库 2023年6月9日
    0125
  • MySQL8.0解决“MySQL 服务无法启动。 服务没有报告任何错误。”

    TL;NRs 初始化服务时最好使用 mysqld –initialized –console命令; MySQL8.0的配置变量与MySQL5.7不同, [mysqld]下面设置…

    数据库 2023年5月24日
    0137
  • Collection

    ArrayList底层使用了数组存储 LinkedList底层使用双向链表 HashSet底层是一个HashMap支持,HashMap底层物理实现一个Hash表 LinkedHas…

    数据库 2023年6月14日
    092
  • 集成 nacos注册中心配置使用

    pom <span class="hljs-tag"><<span class="hljs-name">pro…

    数据库 2023年6月6日
    098
  • postman结合newman生成测试报告

    1. cmd窗口安装newman npm install -g newman 2. cmd窗口安装newman-html报告 nnpm install -g newman-repo…

    数据库 2023年5月24日
    071
  • 数据库中异常与隔离级别

    数据库相对于其它存储软件一个核心的特征是它支持事务,所谓事务的ACID就是原子性,一致性,隔离性和持久性。其中原子性,一致性,持久性更多是关注单个事务本身,比如,原子性要求事务中的…

    数据库 2023年6月9日
    076
  • DevOps

    Docker: ## 安装Docker yum remove docker docker-client docker-client-latest docker-common doc…

    数据库 2023年6月9日
    071
  • git 开发规范

    开发总结最重要的是文档和开发流程 文档最重要:记录开发学习的内容,可以是一种总结,此为其一。留下文档可助后生快速入门,减少学习和指导成本,此为其二。来日需要对项目二次开发或者重构追…

    数据库 2023年6月9日
    0137
  • 多商户商城系统功能拆解22讲-平台端分销商品

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    098
  • 探究MySQL中SQL查询的成本

    成本 什么是成本,即SQL进行查询的花费的时间成本,包含IO成本和CPU成本。 IO成本:即将数据页从硬盘中读取到内存中的读取时间成本。通常1页就是1.0的成本。 CPU成本:即是…

    数据库 2023年5月24日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球