- 什么是连续自增主键?
- 为什么要自增主键
- 何时才使用到自增键的自增值
- 主键的自增值记录在哪里
- 自增值不连续的原因
- 唯一索引约束插入数据失败
- 事务回滚操作
- 批量插入数据
- InnoDB的自增值为什么不能回收利用?
什么是连续自增主键?
我们经常理解得像1,2,3,4,5,6...,n这样的主键才是连续自增的主键。
那么如果我的主键值是1,3,5,7...,2n+1这样的值算是连续自增主键吗?同理,如果我的主键值是2,4,6,8...,2n+2这样的值算是连续自增主键吗?
![160de5fe0170614d28b83c9bbff129b5.png](https://img-blog.csdnimg.cn/img_convert/160de5fe0170614d28b83c9bbff129b5.png)
答案是肯定的。上面的情况都是连续自增的主键。
上面的奇数和偶数自增主键的值,也经常在我们的MySQL主主复制的集群中常见。我们在其中一个主机上面设置所有的主键为奇数增长,另外一台主机上面设置所有的主键为偶数增长,这样在主主复制的时候就可以避免主键冲突的情况发生。所以上面的所有情况都算是连续自增的主键。
所谓的连续自增主键是指表中的主键值按照一个指定的规律连续增长。
为什么要自增主键
由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑,当我们在查询的时候,效率也就更高。这就是我们为什么推荐为每一个InnoDB表都创建自增主键的原因所在。
但是下面的这样的情况,在某种程度上我们也可以认为它是自增主键,虽然它在表面上不是像前面我们提到的那种沿着某种规律增加的主键值,但是它们实现的效果和存在的意义和前面我们提到的连续自增主键是一样的效果。
![30e9d8e165eb71dc722486e8d0ed7db8.png](https://img-blog.csdnimg.cn/img_convert/30e9d8e165eb71dc722486e8d0ed7db8.png)
比如:你的表中数据确实不是连续自增的,并且也不是按照某个规律自增。但是后续也没有任何数据插入到哪些空缺的位置上,这样的数据,我们也认为他们的数据页是连续的,也不会因为数据不连续而导致查询效率降低。它也不会产生数据分页和数据的空洞。
下面举例说明这样的情况。
例如:一个表的主键值是这样的:1,2,3,17,29,100,101,102,200,1000,...n
在[3,17]之间,[17,29]之间,[29,100]之间,这些空隙的地方如果不再插入任何数据,这个表的主键索引在物理存储上就不会发生页分裂的情况,也不会有数据空洞。所以我们也是可以认为是连续的。他们的效率和1,2,3,4,5,6...n这样的自增主键的查询效率是没有差别的。
何时才使用到自增键的自增值
当我们向一个包含自增主键的表中插入数据的时候,如果在插入的时候,把自增主键的值设置为0、null或者不配置这个字段的时候,这个表中插入的数据将使用自增值来自动维护这个字段值。
例如如下3种情况:
Create Table: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQ