この記事では、MySQL の自動インクリメント フィールド値について詳しく説明します (コード付き)。必要な方は参考にしていただければ幸いです。
1 前書き
この記事は、Sifou ネットユーザーからの質問に答えたものです。このネットユーザーは新しいテーブルを作成し、auto_increment_increment が 10 に設定され、AUTO_INCREMENT プライマリの開始値が設定されました。データを挿入したとき、主キーの値が 11 から始まることに気づき、混乱しました。この記事では、自動インクリメントフィールドの問題について説明します。
2 自動インクリメント フィールドの計算方法
自動インクリメント フィールドの値は、auto_increment_increment パラメーターと auto_increment_offset パラメーターに関連しており、auto_increment_offset パラメーターは auto_increment_offset パラメーターを設定します。 -increment フィールドのオフセット値。これも開始値を計算します。auto_increment_increment パラメーターは、自動インクリメント フィールドのステップ サイズ、つまり毎回増加する量を設定します。 auto_increment_increment と auto_increment_offset は、主キーの重複を防ぐためにマスター間レプリケーションでよく使用されます。 auto_increment_increment は整数型で、値は 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 が自動インクリメント フィールドである場合、a=xx および c という条件でデータに対して独立した増加計算が実行されます。 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 の自動インクリメントフィールド値の詳細な紹介 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。