MySQL自增字段取值的细致引见(附代码)【MySQL教程】,数据库,mysql
作者:搜教程发布时间:2019-11-27分类:MySQL教程浏览:42评论:0
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网别的相干文章!
相关推荐
- LG可卷曲手机已在韩国运营商数据库中注册,或搭载骁龙888处理器 完美教程文章资讯
- 如何修改mysql的默认时区_MySQL教程,mysql,时区
- mysql数据库如何创建数据表_MySQL教程,mysql,数据表
- linux源码安装mysql5.7_MySQL教程,linux,mysql,mysql5.7
- mysql外键约束怎么写_MySQL教程,mysql,外键约束
- php上传图片无法显示的问题_php教程,php,数据库,html
- mysql如何设置字符集为UTF8_MySQL教程,mysql,UTF8,字符集
- mysql怎么创建数据库_MySQL教程,mysql,数据库
- 如何查看mysql的日志文件_MySQL教程,mysql,日志文件
- mysql如何删除表中一行数据?_MySQL教程,mysql
你 发表评论:
欢迎- MySQL教程排行
-
- 1如何修改mysql的默认时区_MySQL教程,mysql,时区
- 2mysql数据库如何创建数据表_MySQL教程,mysql,数据表
- 3linux源码安装mysql5.7_MySQL教程,linux,mysql,mysql5.7
- 4MySQL 连接查询超级详解_MySQL教程,MySQL,连接查询
- 5MySQL如何使用授权命令grant_MySQL教程,MySQL,grant
- 6mysql外键约束怎么写_MySQL教程,mysql,外键约束
- 7sql数据库触发器怎么创建_MySQL教程,sql,触发器
- 8MySQL中explain用法和结果分析(详解)_MySQL教程,MySQL,explain
- 9mysql如何设置字符集为UTF8_MySQL教程,mysql,UTF8,字符集
- 最新文章
- 广而告之