ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

主键自增理解

2022-01-29 18:34:38  阅读:142  来源: 互联网

标签:自增 增值 xuehu id 插入 理解 主键


主键自增理解

自增主键:

InnoDB引擎的自增值,其实是保存在内存里,并且到了MySQL8.0版本之后,才有了自增值持久化的能力。也就是实现了如果发生重启后,表的自增值可以恢复为MySQL重启前的值。

在MySQL5.7及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值max(id),然后将max(id)+1作为这个表当前的自增值。

在MySQL8.0版本,将自增值的变更记录在redo log日志中,重启的时候依靠redo log日志恢复重启之前的值。

自增值修改机制:

1.如果插入数据时id字段指定为0、null、或未指定值,那么就把这个表当前的AUTO_INCREMENT值填到自增字段;

2.如果插入数据时id字段制定了具体的值,就直接使用语句里指定的值

自增值新增机制:

1.如果准备插入的值>=当前自增值,新的自增值就是准备插入的值+1;

2.否则,自增值不变。

为什么自增主键不连续

  • 在MySQL 5.7及之前的版本,自增值保存在内存里,并没有持久化

  • 事务回滚(自增值不能回滚,因为并发插入数据时,回滚自增ID可能会造成主键冲突)

  • 唯一键冲突(由于表的自增值已变,但是因为主键发生冲突没插进去,下一次插入主键值=现在变化了的自增值+1,所以不连续)

代码实践:

create table xuehu(
    id int primary key auto_increment,
    name varchar(10) unique ,
    age int
);
# 插入第一条数据时
insert into xuehu(id,name,age) values (1,'yexueling',18);
select * from xuehu;

在这里插入图片描述

# 插入第二条数据时,由于唯一键冲突,插入数据失败,但是主键自增值+1
insert into xuehu(id,name,age) values (null,'yexueling',18);
select * from xuehu;   

在这里插入图片描述

# 插入第三条数据时,id=3,出现了自增主键不连续的情况。
insert into xuehu(id,name,age) values (null,'hanyan',25);
select * from xuehu;

在这里插入图片描述

标签:自增,增值,xuehu,id,插入,理解,主键
来源: https://blog.csdn.net/ag1412/article/details/122746348

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有