0

0

MySQL自增字段取值的详细介绍(附代码)

不言

不言

发布时间:2018-12-15 10:44:49

|

3736人浏览过

|

来源于segmentfault

转载

本篇文章给大家带来的内容是关于mysql自增字段取值的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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的值,也不影响自增字段的计算

Python操作Mysql实例代码教程
Python操作Mysql实例代码教程

本文介绍了Python操作MYSQL、执行SQL语句、获取结果集、遍历结果集、取得某个字段、获取表字段名、将图片插入数据库、执行事务等各种代码实例和详细介绍,代码居多,是一桌丰盛唯美的代码大餐。如果想查看在线版请访问:https://www.jb51.net/article/34102.htm

下载

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的时候非常方便。

相关专题

更多
C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

29

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

55

2026.01.22

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Django 教程
Django 教程

共28课时 | 3.4万人学习

Excel 教程
Excel 教程

共162课时 | 13万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号