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
的时刻异常轻易。
以上就是MySQL自增字段取值的细致引见(附代码)的细致内容,更多请关注ki4网别的相干文章!