本篇文章给大家带来的内容是关于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的值,也不影响自增字段的计算

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

php mysql 字段自增_MySQL自增字段取值的详细介绍(附代码)相关推荐

  1. mysql的增_MySQL之增_insert-replace

    MySQL增删改查之增insert.replace 一.INSERT语句 带有values子句的insert语句,用于数据的增加 语法: INSERT [INTO] tbl_name[(col_nam ...

  2. mysql设置id起点_mysql自增ID起始值修改方法

    在MysqL中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍MysqL自增ID的起始值修改与设置方法. 通常的设置自增字段的方法:创建表格时添 ...

  3. mysql 主键 自增_MySQL自增主键详解

    一.自增值保存在哪儿? 不同的引擎对于自增值的保存策略不同 1.MyISAM引擎的自增值保存在数据文件中 2.InnoDB引擎的自增值,在MySQL5.7及之前的版本,自增值保存在内存里,并没有持久化 ...

  4. mysql insert 自增_MySQL自增列插入0值的解决方案

    在将数据库从MSSQL迁移到MySQL的过程中,基于业务逻辑的要求,需要在MySQL的自增列插入0值.在MSSQL中是这样完成的: string sql;sql = " set identi ...

  5. mysql多select合并_mysql 多个字段合并

    group_concat 函数 默认","合并 select p.id as patent_id,p.application_no,p.name,p.inventer,group_ ...

  6. mysql int 正数 范围_mysql中整数字段不同类型的取值范围

    mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,整数(int)字段类型分有符号和无符号两种(UNSIGNED属性就是将数字类型无符号化,与C.C++这些程序语言中的unsigned含 ...

  7. mysql字段类型原理_mysql数据类型和字段属性原理与用法详解

    本文实例讲述了mysql数据类型和字段属性.分享给大家供大家参考,具体如下: 本文内容: 数据类型 数值类型 整数型 浮点型 定点型 日期时间类型 字符串类型 补充: 显示宽度与zerofll 记录长 ...

  8. mysql增加字段默认位置_MySQL语句增加字段,修改字段名,修改类型,修改默认值

    增加字段: alter table 表名 ADD 字段 类型 约束 [默认值 注释] ALTER TABLE video ADD category_id int(11) unsigned not nu ...

  9. mysql修改字段名称脚本_mysql数据库修改字段及新增字段脚本

    1.修改字段的长度 ALTER TABLE MODIFY COLUMN 字段名  数据类型(修改后的长度) 例句:ALTER TABLE test_table MODIFY COLUMN id INT ...

最新文章

  1. 浙大吴飞「舌战」阿里贾扬清:AI内卷与年薪百万,哪个才是真实?
  2. 如何在Objective C中声明Block?
  3. 安卓开发 fastjson 解析json使用详解
  4. python取出矩阵中的某一元素_将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例...
  5. Vivado设计流程(五)工程实现
  6. Hbase compact入门
  7. linux测试进程内存,怎么测试进程运行时的内存用量
  8. html星号密码查看器,万能星号密码查看器
  9. matlab脉冲调制,基于matlab脉宽调制方法的研究
  10. win10如何禁止CDR软件访问网络的设置方法教程
  11. 泛泰A870(高通600 cpu 720p) 刷4.4专用中文recovery TWRP2.7.1.1版(三版通刷)
  12. c语言 程序设计 题库答案 p,《C语言程序设计》复习题库答案.doc
  13. CentOS 6.3安装chrome
  14. 安徽身份证网上办理最全攻略
  15. 最新唯美520表白纪念网页HTML源码+UI超级好看
  16. 今天nba预测分析_NBA情报预测分析_NBA足球俱乐部 - 全球体育网
  17. easyRtc设置视频清晰度的方法
  18. 如何解决夜神模拟器连不上adb的问题
  19. AspectJ编译器织入与SpringAOP的运行期织入
  20. Jenkins报Failed to remove prefix from file named

热门文章

  1. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (19) - 系统代理
  2. 基于yolov3和pythorch框架的火焰识别检测算法
  3. mysql参数优化51cto_mysql的优化参数
  4. capcreatecapturewindowa 说明_阳江陶瓷坯体增强剂使用说明
  5. Win7下使用openssl时出现“Unable to write ‘random state’‘的问题
  6. mac 解压_BetterZip for Mac(Mac解压压缩工具)
  7. 北京化工大学计算机专业就业,北京化工大学特色专业介绍_计算机科学与技术_专业课程介绍_专业排名_就业方向...
  8. 关于C#中虚方法重载的说明
  9. 【★】百度网盘背后的真实策略!
  10. 专访声智科技陈孝良:把自己嫁给公司,伟大都是熬出来的