首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 主键语句_MySQL 主键

主键有两个性质需要考虑: 单调性 每次插入一条数据,其 ID 都是比上一条插入的数据的 ID 大,就算上一条数据被删除。...主键的单调性 为何会有单调性的问题? 这主要跟主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。...主键最大值怎么取的?存放到哪里?...从 MySQL 8.0 开始,主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...参考文档 为什么 MySQL主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

10.8K10

mysql主键策略_MySQL 主键机制

主键:特指在增列上定义的主键主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 增值保存在哪? 不同的存储引擎保存增值的策略不一样; a....对于MyISAM引擎,增值保存在数据文件中; b. Innodb引擎,mysql5.7之前,增值保存在内存中,而且不会持久化增值。...每次重启后第一次打开表,都会去查找增值的最大值max(id), 并设置表当前增值为max(id) + 1; mysql8.0, 增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...增值修改发生在插入数据的操作之前,如果插入失败,增值不会再修改回去; b. 事务回滚也不会将自增值修改回去; c. 为了减少id锁带来的性能影响,mysql不会修改回去之前的增值; 4....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请 id 的策略(注:该策略是导致 id 不连续的第三种原因

9.4K50
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL主键值回溯问题

平时我们使用MySQL时,通常每一个表都会有一个主键ID,每新增一条数据,ID值就会1。但在8.0之前版本的MySQL中,这个增值会存在一个回溯的问题。...例如,在一个新表中插入三条主键为1、2、3的数据行,这时候用SHOW CREATE TABLE命令查看该表的AUTO_INCREMENT的值是4,这是没问题的。...但如果重启一下MySQL,这个值就会变回3,而不是4,发生了回溯。...这是因为AUTO_INCREMENT的值只存储于内存中,不会持久化到磁盘,每次启动数据库时,MySQL会通过计算max(auto_increment字段) + 1,重新作为该表下一次的主键ID的增值。...这个问题直至MySQL 8.0才修复。 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/149188.html原文链接:https://javaforall.cn

4.1K20

MySQL主键详解「建议收藏」

(初始值)开始,以auto_increment_increment(步长)为步长,持续叠加,直到找到第一个大于X的值,作为新的增值 三、增值的修改时机 创建一个表t,其中id是主键字段、c是唯一索引...出现了主键不连续的情况 唯一键冲突和事务回滚都会导致主键id不连续的情况 四、锁的优化 id锁并不是一个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请 但在MySQL5.0版本的时候...锁还是要等语句结束后才被释放 3.这个参数设置为2,所有的申请主键的动作都是申请后就释放锁 为了数据的一致性,默认设置为1 如果sessionB申请了增值以后马上就释放锁,那么就可能出现这样的情况...所以,锁直到语句执行结束才释放,就是为了达到这个目的 2)在binlog里面把插入数据的操作都如实记录进来,到备库执行的时候,不再依赖于主键去生成。...之后,再执行insert into t2 values(null, 5,5),实际上插入了的数据就是(8,5,5) 这是主键id出现id不连续的第三种原因 五、主键用完了 主键字段在达到定义类型上限后

5.8K40

mysql为什么建议使用主键

我们都知道表的主键一般都要使用 id,不建议使用业务 id ,是因为使用 id 可以避免页分裂。这个其实可以相当于一个结论,你都可以直接记住这个结论就可以了。...如果主键 id 的话,mysql 在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。...如果主键是非 id,为了确保索引有序,mysql 就需要将每次插入的数据都放到合适的位置上。...其实对主键 id 还有一个小小的要求,在满足业务需求的情况下,尽量使用占空间更小的主键 id,因为普通索引的叶子节点上保存的是主键 id 的值,如果主键 id 占空间较大的话,那将会成倍增加 mysql...本来这篇文章是打算总结一下前面写的几篇关于 mysql 索引的文章的,也是打算多举几个例子的,结果发现光写了一个主键就写了一大堆了,然后时间也比较晚了,干脆就写到这吧,原本计划的几个其他例子后面再单独写吧

4.9K31

MySQL主键为什么不连续

主键可以让主键索引尽量的保持递增顺序插入,避免页分裂,索引更加紧凑。 主键保存在何处?...不同的引擎对于增值的保存策略不同: MyISAM引擎的增值保存在数据文件中 InnoDB引擎的增值保存在内存里,但是在MySQL8.0以后,该自增值才可以被持久化:MySQL5.7以前,增值没有持久化每次重启后第一次打开表的时候...(默认值是1)开始,以auto_increment_increment(默认值是1)为步长,持续叠加,直到找到第一个大于X的值,作为新的增值 唯一键冲突导致主键不连续 insert into t...t\G 可以看到主键已经从3变成4,但是并没有因为事务的回滚回退。...(去主键索引树上判断该id是否存在) 把id的锁范围扩大,必须等到一个事务提交后才,下一个事务才可以申请id,锁粒度太大,系统并发能力极大下降 为了避免上述的性能消耗,InnoDB即使语句执行失败也不回退

8.3K20

MySQL 主键 ID 会用完吗?

MySQL 主键 ID 会用完吗?...首先我们一般创建 MySQL 数据表的时候,大部分情况下会创建一个主键ID 的字段,可能你的建表语句如下: CREATE TABLE IF NOT EXISTS `tb`( `id` INT...所以 在 MySQL ID 是会用完的。那么问题来了,加入他的 ID 用完会发生什么事呢? 我们来验证下。...如果会那么久需要创建 8 字节的 INT 类型了,他的值最大是 2^64-1 那么问题又来了,你说 我有些业务是不需要主键 、不需要编号,我不创建这个字段,就好了,这样想恭喜你 回答错误....总结: ID 用完 会报主键冲突、数据插入失败。 不指定主键、默认创建的 row_id 会 覆盖原有的数据。

9.5K20

mysql设置主键删除部分数据,将主键顺序重新排序解决方案

原因:在进行数据的插入删除的时候,总会有以前创建的数据被删除的情况,但是删除后再添加,还是从当前id最大的值进行的,所以是这样下去可能时间长了就会超出范围 解决方案: 如果直接在数据库中进行操作,...第一步:对你的项目进行配置,因为像是springboot的框架中,要想执行多条语句,要进行相关的配置如下: url: jdbc:mysql://localhost:3306/dare?...--对增列进行重新排序--> ALTER TABLE `table_name` DROP `id`; ALTER TABLE `table_name` ADD `id`...` int NOT NULL AUTO_INCREMENT,ADD PRIMARY KEY(id); 2、如果是在对应的项目中,则在对应的mapper的xml文件中执行 解释:因为我是想的是在删除数据后对表中的...--对增列进行重新排序--> ALTER TABLE `table_name` DROP `id`; ALTER TABLE `table_name` ADD `id`

4.2K20

MySQL主键一定是连续

但实际上,MySQL主键并不能保证一定是连续递增的。...这时候,我们删除 id=1 的行,AUTO_INCREMENT 还是 2。 但如果马上重启 MySQL 实例,重启后这个表的 AUTO_INCREMENT 就会变成 1。...更遗憾的是,即使在初始值和步长这两个参数都设置为 1 的时候,主键 id 也不一定能保证主键是连续的 增值不连续场景 2 举个例子,我们现在往表里插入一条 (null,1,1) 的记录,生成的主键是...所以,在这之后,再插入新的数据行时,拿到的 id 就是 3。也就是说,出现了主键不连续的情况。...增值不连续场景 4 对于批量插入数据的语句,MySQL 有一个批量申请 id 的策略: 语句执行过程中,第一次申请 id,会分配 1 个; 1 个用完以后,这个语句第二次申请 id,会分配

3.7K10

为什么要用主键

我觉得设置主键的最主要目的是:应对变化。 笔者遇到的场景为:维护商业账号的资质相关信息。账号是由全局唯一且的分布式ID生成器生成的,很显然这个时候我们把账号作为主键这就天然合理。...,实际上drop掉主键,这个时候Mysql是没有主键状态的。...如果我们一开始设计表的时候,就用业务无关的ID作为主键,那么本次升级就不会变得这么麻烦。...推荐的做法是,在系统设计之初: 设置主键; 把当前需要约束的键(这里即账号ID)作为唯一键约束; 主键: 1.可以定义一列或多列为主键。...如果不是主键,那么可能会在中间插入,学过数据结构的同学都知道,在中间插入,B+树为了维持平衡,引起B+树的节点分裂。总的来说用主键是可以提高查询和插入的性能。

4.2K40

39 | 主键不连续

主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。...比如,双 M 的主备结构里要求双写的时候,我们就可能会设置成 auto_increment_increment=2,让一个库的 id 都是奇数,另一个库的 id 都是偶数,避免两个库生成的主键发生冲突...因为,本来申请 id 是一个很快的操作,现在还要再去主键索引树上判断 id 是否存在。 把 id 的锁范围扩大,必须等到一个事务执行完成并提交,下一个事务才能再申请 id。...锁的优化 id 锁并不是一个事务锁,而是每次申请完就马上释放,以便允许别的事务再申请 在 MySQL 5.0 版本的时候,锁的范围是语句级别。...… select 这样的批量插入数据的语句,锁还是要等语句结束后才被释放; 这个参数的值被设置为 2 时,所有的申请主键的动作都是申请后就释放锁。

4.8K10

【说站】mysql主键用完的处理办法

mysql主键用完的处理办法 一般情况下,我们不会让单表存储这么多数据,所以一般不会出现这个问题。 处理办法: 1、可以使用bigint(无符号)类型作为主键。...如果真的在一个表中存储那么多数据,或者在数据迁移时造成主键混乱。 2、使用bigint(无符号)类型时,每秒插入大量数据,单表数据量依然能够持续存放相当长的时间。...实例 主键字段在达到定义类型上限后,再插入一行记录,则会报主键冲突的错误。...INSERT INTO t VALUES(NULL); 第一个insert语句插入数据成功后,这个表的AUTO_INCREMENT没有改变(还是4294967295),就导致了第二个insert语句又拿到相同的...以上就是mysql主键用完的处理办法,希望对大家有所帮助。更多mysql学习指路:MySQL 推荐操作系统:windows7系统、mysql5.8、DELL G3电脑

2.7K30

为什么建议主键整型

昨天看到一个MySQL数据库设计原则:强烈建议表的主键使用整型主键。为啥呢?...为什么主键建议整型、? 了解了数据的存储方式以及查询过程和插入过程,我们接下来进入正题,回答为什么主键建议是整型、这个问题。 首先为什么是整型呢?...那为什么呢?...我们都知道当某一个业务量增长非常快,数据量非常大,数据库性能无法满足业务需求的时候通常会实施分库分表,这个时候主键就不适用了,比如订单表,分成16个表,如果都使用的话,肯定会造成订单id重复,所以此时的解决方案就是分布式...小结 今天我通过讲解MySQL数据的存储方式以及数据查找与插入过程,从MySQL的底层机制了解了MySQL主键为什么建议使用整型并且,最后我们引申了一个分布式id的问题,此时并不强制严格,保证趋势递增即可

1.1K40
领券