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


本文摘自PHP中文网,作者不言,侵删。

本篇文章给大家带来的内容是关于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可以动态改变,但是计算自增字段取值的时候,不会受已经存在的数据影响,计算方式不变。

下面让我们做一些测试

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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是否会有影响

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

阅读剩余部分

相关阅读 >>

phpmyadmin怎么优化数据库

mysql 简单全量备份和快速恢复的方法

mysql大于等于怎么写

基于 mysql 实现一个简易版搜索引擎

mysql怎么查看用户名?

六天带你玩转mysql视频教程资源推荐

mysql变量、游标及存储过程的应用

保护mysql数据仓库的5个方法

lamp 如何修改mysql密码

c#实现操作mysql数据层类mysqlhelper实例

更多相关阅读请进入《数据库》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...