mysql 主键自增语句_MySQL 自增主键

本文详细探讨了MySQL中InnoDB存储引擎的自增主键特性,包括单调性和连续性。单调性问题源于自增主键最大值的获取方式,可能导致ID重复。从MySQL 8.0开始,通过redo log解决此问题。连续性问题则与事务回滚有关,可通过设置不同的innodb_autoinc_lock_mode来调整。文章还讨论了不同插入类型对ID连续性的影响,并提供了相关参考文献。
摘要由CSDN通过智能技术生成

以下仅考虑 InnoDB 存储引擎。

自增主键有两个性质需要考虑:

单调性

每次插入一条数据,其 ID 都是比上一条插入的数据的 ID 大,就算上一条数据被删除。

连续性

插入成功时,其数据的 ID 和前一次插入成功时数据的 ID 相邻。

自增主键的单调性

为何会有单调性的问题?

这主要跟自增主键最大值的获取方式,以及存放位置有关系。

如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。

自增主键最大值怎么取的?存放到哪里?

MySQL 5.7 及之前的版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存:

SELECT MAX(ai_col) FROM table_name FOR UPDATE;

这样获取是通过计算的,并且由于存放在内存而容易丢失。

如果删除最新一条数据(假设 ID 为 10),因故障或者其他必要重启后再插入一条数据时会使用之前的 ID (即 ID 为 10)。

问题在于如果有其他表依赖了该 ID,则其他表的数据关联到的数据就符合要求了。除非设置了外键。

比如我要向最大一个 ID 的账号充了 100 万。但是在充值之前,该账号被删除,然后服务器故障重启,重启后有人新注册了一个账号。结果我的 100 万充到了他的新账号上。注册新账号的人以为是新手福利,笑嘻嘻。

如何解决单调性的问题?

从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值