Maison  >  Article  >  base de données  >  Introduction détaillée à la valeur du champ d'incrémentation automatique MySQL (avec code)

Introduction détaillée à la valeur du champ d'incrémentation automatique MySQL (avec code)

不言
不言avant
2018-12-15 10:44:493535parcourir

Ce que cet article vous apporte est une introduction détaillée à la valeur du champ d'incrémentation automatique MySQL (avec code). Les amis dans le besoin peuvent s'y référer.

1 Préface

Cet article est issu d'une réponse à une question d'un internaute sur Sifou Cet internaute a créé une nouvelle table, avec auto_increment_increment défini à 10 et la valeur de départ du primaire AUTO_INCREMENT. clé définie sur 9. Lorsqu'il a inséré les données, il a constaté que la valeur de la clé primaire commençait à 11, il était donc confus. Cet article aborde la question des champs à incrémentation automatique.

2 Méthode de calcul du champ d'incrémentation automatique

La valeur du champ d'incrémentation automatique est liée au paramètre auto_increment_increment et au paramètre auto_increment_offset Le paramètre auto_increment_offset définit l'auto. -increment field offset value, également Il s'agit de calculer la valeur de départ. Le paramètre auto_increment_increment définit la taille du pas du champ d'auto-incrémentation, c'est-à-dire de combien il augmente à chaque fois. auto_increment_increment et auto_increment_offset sont souvent utilisés dans la réplication maître-maître pour empêcher la duplication de clé primaire. auto_increment_increment est un type Integer avec une valeur de 1-65535. S'il est défini sur 0, il sera remplacé par 1. Si le paramètre dépasse la plage de valeurs, il sera modifié par 65535.

La valeur du champ d'auto-incrémentation est calculée via la formule auto_increment_offset + N × auto_increment_increment, et N est une séquence croissante similaire à [1,2,3,...]. Lors de l'insertion d'une donnée, la base de données prendra le plus petit élément supérieur ou égal au AUTO_INCREMENT actuel de la séquence d'incrément calculée par auto_increment_offset + N × auto_increment_increment comme prochaine valeur d'auto-incrémentation du champ.

auto_increment_increment peut être modifié dynamiquement, mais lors du calcul de la valeur du champ d'auto-incrémentation, il ne sera pas affecté par les données existantes et la méthode de calcul reste inchangée.

Faisons quelques tests

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)

Nous avons d'abord créé un tableau contenant des champs à incrémentation automatique, défini la taille du pas à 10, inséré les données et constaté que la croissance est bien calculée en la valeur de la formule. Testons ensuite si la définition de AUTO_INCREMENT lors de la création d'une table aura un impact

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)

Vous pouvez voir que même si la valeur de AUTO_INCREMENT est définie, cela n'affectera pas le calcul des champs d'auto-incrémentation

3 Autres situations

Ce qui précède est la valeur dans des circonstances normales. Ci-dessous, nous discutons d'un cas particulier

3.1 Augmentation automatique selon le regroupement

.

Il existe un cas particulier. Cela empêchera le champ d'auto-incrémentation de s'augmenter automatiquement, c'est-à-dire que lors de l'utilisation du moteur MyISAM et de l'utilisation d'un index conjoint, le champ d'auto-incrémentation sera le premier champ du non- indice commun.

Dans ce cas, la valeur du champ d'auto-incrémentation est MAX(auto_increment_column) + auto_increment_offset WHERE prefix=given-prefix. Comment comprendre que lors du calcul de la valeur de croissance, faites un champ devant. le groupe de champs d'auto-incrémentation d'index commun et effectuez un calcul de croissance indépendant au sein du groupe.

Par exemple, si vous créez un index conjoint sur a, b et c, et que c est un champ à incrémentation automatique, effectuez un calcul de croissance indépendant pour les données sous la condition où a=xx et b =xx. Voici un exemple :

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)

Comme le montrent les résultats, dans les champs avec le même champ name, il y aura des calculs d'auto-augmentation indépendants. Cette méthode de calcul est très pratique lors de l'exécution. group by .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer