旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

MySQL自增字段取值的细致引见(附代码)【MySQL教程】,数据库,mysql

作者:搜教程发布时间:2019-11-27分类:MySQL教程浏览:42评论:0


导读:本篇文章给人人带来的内容是关于MySQL自增字段取值的细致引见(附代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。1媒介本文来自回覆思否网友...
本篇文章给人人带来的内容是关于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的时刻异常轻易。

以上就是MySQL自增字段取值的细致引见(附代码)的细致内容,更多请关注ki4网别的相干文章!

标签:数据库mysql


欢迎 发表评论: