実現原理
- 各自己インクリメント列は、グローバルに表示されるキーと値のペアを使用して、現在割り当てられている最大 ID を記録します。
- 自己インクリメント ID を割り当てるための分散システムのネットワーク オーバーヘッドを削減するために、各 TiDB ノードは一意の ID セグメントをキャッシュします。
- 現在の事前割り当て ID セグメントが使い果たされるか、再起動されると、新しい ID セグメントが再度適用されます。
使用制限
- 主キーまたは一意のインデックスの列に定義する必要があります
- 整数、FLOAT、または DOUBLE 列にのみ定義できます。
- 列のデフォルト値と同時に同じ列に指定することはサポートされていません。
- alter table を使用した auto_increment 属性の追加はサポートされていません
- セッション変数 @@tidb_allow_remove_auto_inc は、変更テーブルを通じて auto_increment 属性を削除できるかどうかを制御するために使用する必要がありますが、これはデフォルトでは許可されていません
auto_increment 属性
- auto_increment: デフォルトのフィールド値を自動入力する属性
- パフォーマンスを考慮して、auto_increment 番号は各 TiDB インスタンスにバッチで割り当てられます。
- キャッシュ バッチのサイズは auto_id_cache テーブル オプションで制御できます。
- last_insert_id() は、最後の挿入操作で使用された値を取得できます。
関連パラメータ
AUTO_INCREMENT: デフォルトのフィールド値を自動的に設定するために使用される属性です。
- パフォーマンスを考慮して、AUTO_INCREMENT 番号が各 TiDB サーバー インスタンスにバッチで割り当てられます。
- キャッシュのバッチ サイズは、AUTO_ID_CACHE テーブル オプションで制御できます。
- LAST_INSERT_ID() は、最後の挿入操作で使用された値を取得できます。
- auto_increment_increment は毎回どのくらい増加するか、ステップ サイズ
- auto_increment_offset の初期値は何ですか。
- tidb_allow_remove_auto_inc 列の自動増分属性を削除できるようにします。デフォルトは許可されません。
tidb> show variables like 'auto_increment_%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 | # 每次增长多少,步长
| auto_increment_offset | 1 | # 初始的数值是多少。
+--------------------------+-------+
# tidb_allow_remove_auto_inc 允许删除 列上的auto increment属性。默认是不允许。
tidb> show variables like 'tidb_allow_remove_auto_inc';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| tidb_allow_remove_auto_inc | OFF |
+----------------------------+-------+
1 row in set (0.01 sec)
例
- テーブルを作成する
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1 (
id int PRIMARY KEY AUTO_INCREMENT,
from_port char(4));
DROP TABLE IF EXISTS test.t2;
CREATE TABLE test.t2 (
id int PRIMARY KEY AUTO_INCREMENT,
from_port char(4))
AUTO_ID_CACHE 300; # 从300的基础上 开始增长 TiDB server 1 0-300 TiDB Server 2 301-600
- 挿入を実行する
/* Populate */
INSERT INTO test.t1 (from_port) VALUES ('4000'), ('4000'),
('4000');
# id : 1,2,3
/* Check value */
select id, from_port from test.t1;
/* Explictly assign value "7" to auto_increment column */
insert into test.t1 values (7, '4000');
# id: 1,2,3,7
/* Check value */
select id, from_port from test.t1;
/* Relying on auto_increment values to assign values to new rows
*/
insert into test.t1 (from_port) values ('4000');
insert into test.t1 (from_port) values ('4000');
/* Check value */
select id, from_port from test.t1;
# id: 1,2,3,7,8,9
注意:如果实在4000端口上执行,则结果是
# id: 1,2,3,4,5,7
- さまざまな TiDB のキャッシュ バッチ サイズを確認する
/* 在4000端⼝的tidb上插⼊数据 */
insert into test.t2 (from_port) values ('4000');
insert into test.t2 (from_port) values ('4000');
# id: 1,2
/* 在4001端⼝的tidb上插⼊数据 */
insert into test.t2 (from_port) values ('4001');
insert into test.t2 (from_port) values ('4001');
/* 查询t2中的数据 */
select * from test.t2
# id: 1,2,301,302
- 同じ ID が異なる TiDB に挿入されていることを確認します。
/* 在4000端⼝的tidb上插⼊数据 */
insert into test.t2 (id,from_port) values (90000,'4000');
/* 在4001端⼝的tidb上插⼊数据 */
insert into test.t2 (id,from_port) values (90000,'4001');
注: これにより、挿入された値が重複していることを示すエラーが報告されます。