摘要:可以动态改变,但是计算自增字段取值的时候,不会受已经存在的数据影响,计算方式不变。例如对做了联合索引,是自增字段,那么对这个条件下的数据做独立的增长计算。
1 前言
本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值是从11开始的,所以产生了疑惑。这篇文章一起来讨论一下自增字段问题。
2 自增字段计算方式自增字段取值和auto_increment_increment参数和auto_increment_offset参数有关,auto_increment_offset参数设置的是自增字段偏移值,也就是计算起始值,auto_increment_increment参数设置的是自增字段的步长,也就是每次增加多少。auto_increment_increment和auto_increment_offset经常用在主主复制中防止主键重复。auto_increment_increment为Integer类型,取值1-65535,如果设置为0,会改为1,如果设置超过取值范围,会改为65535。
自增字段的取值是通过auto_increment_offset + N × auto_increment_increment这个公式计算出来的,而N是一个类似于[1,2,3,...]这样的递增序列。当插入一条数据时,数据库会从auto_increment_offset + N × auto_increment_increment计算出来的递增数列中取大于等于当前AUTO_INCREMENT的最小一个元素作为该字段下一个自增的值。
auto_increment_increment可以动态改变,但是计算自增字段取值的时候,不会受已经存在的数据影响,计算方式不变。
下面让我们做一些测试
db83-3306>>SET @@auto_increment_increment=10; Query OK, 0 rows affected (0.00 sec) db83-3306>>SHOW VARIABLES LIKE "auto_inc%"; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 10 | | auto_increment_offset | 1 | +--------------------------+-------+ 2 rows in set (0.00 sec) db83-3306>>CREATE TABLE autoinc1( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY -> ) engine=InnoDB; Query OK, 0 rows affected (0.01 sec) db83-3306>>INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 db83-3306>>select * from autoinc1; +----+ | id | +----+ | 1 | | 11 | | 21 | | 31 | +----+ 4 rows in set (0.00 sec)
我们先创建了一个包含自增字段的表,把步长设为10, 插入数据发现增长确实是公式中计算的值。下面我们再测试一下建表时设置AUTO_INCREMENT是否会有影响
db83-3306>>CREATE TABLE autoinc2( -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY -> ) engine=InnoDB AUTO_INCREMENT=8; Query OK, 0 rows affected (0.01 sec) db83-3306>>INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 db83-3306>>select * from autoinc2; +----+ | id | +----+ | 11 | | 21 | | 31 | | 41 | +----+ 4 rows in set (0.00 sec)
可以看到即使设置了AUTO_INCREMENT的值,也不影响自增字段的计算
3 其他情况上面那是正常情况下的取值,下面我们探讨一种特殊情况
3.1 根据分组自增长有一种特殊情况会造成自增长字段可能不会自增长, 就是当使用 MyISAM引擎,且使用了联合索引,自增字段为非联合索引首个字段。
这种情况下,自增字段取值为MAX(auto_increment_column) + auto_increment_offset WHERE prefix=given-prefix, 怎么理解,就是计算增长值的时候,对联合索引自增长字段前面字段做一个分组,在该分组内做一个独立的增长计算。
例如对a,b,c做了联合索引,c是自增字段,那么对where a=xx and b=xx这个条件下的数据做独立的增长计算。下面是实例:
db83-3306>>CREATE TABLE user_pets ( -> name varchar(16) NOT NULL, -> id_inc INT NOT NULL AUTO_INCREMENT, -> pets varchar(16) NOT NULL, -> PRIMARY KEY (name, id_inc) -> ) ENGINE=MyISAM; Query OK, 0 rows affected (0.00 sec) db83-3306>>INSERT INTO user_pets(name, pets) VALUES -> ("chengqm", "dog"), -> ("chengqm", "cat"), -> ("chengqm", "fish"), -> ("yexm", "dog"), -> ("yexm", "cat"), -> ("yexm", "fish"); Query OK, 6 rows affected (0.00 sec) Records: 6 Duplicates: 0 Warnings: 0 db83-3306>>SELECT * FROM user_pets; +---------+--------+------+ | name | id_inc | pets | +---------+--------+------+ | chengqm | 1 | dog | | chengqm | 11 | cat | | chengqm | 21 | fish | | yexm | 1 | dog | | yexm | 11 | cat | | yexm | 21 | fish | +---------+--------+------+ 6 rows in set (0.00 sec)
从结果可以看出,在name字段相同的字段内,会有独立的自增长计算,这种计算方式在做group by的时候非常方便。
参考:
https://dev.mysql.com/doc/ref...
https://dev.mysql.com/doc/ref...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/62642.html
摘要:可以动态改变,但是计算自增字段取值的时候,不会受已经存在的数据影响,计算方式不变。例如对做了联合索引,是自增字段,那么对这个条件下的数据做独立的增长计算。 1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值是从11开始的,所以产生了疑惑。...
摘要:可以动态改变,但是计算自增字段取值的时候,不会受已经存在的数据影响,计算方式不变。例如对做了联合索引,是自增字段,那么对这个条件下的数据做独立的增长计算。 1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值是从11开始的,所以产生了疑惑。...
摘要:结构化查询语言简称,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询更新和管理关系数据库系统。 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 添加一个自增ID字段 ALTER TABLE tblname ADD CO...
摘要:结构化查询语言简称,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询更新和管理关系数据库系统。 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 添加一个自增ID字段 ALTER TABLE tblname ADD CO...
摘要:索引的原理与应用索引类型,存储结构与锁在数据结构与算法索引一节中,我们讨论了这样的文件索引以及全文索引的基础算法,本文则会针对文件索引在关系型数据库中的实际应用进行探讨。这个索引的是数据表的主键,因此表数据文件本身就是主索引。 showImg(https://segmentfault.com/img/remote/1460000018453572?w=1280&h=554); 本文节选...
阅读 2388·2021-10-09 09:43
阅读 3600·2021-09-27 13:35
阅读 810·2021-09-24 09:48
阅读 2654·2021-09-22 15:42
阅读 2145·2021-09-22 15:28
阅读 3035·2019-08-30 15:43
阅读 2493·2019-08-30 13:52
阅读 2872·2019-08-29 12:48