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!