AUTO_INCREMENT
AUTO_INCREMENT
StarRocksはバージョン3.0以降、データ管理を簡素化するためのAUTO_INCREMENT
列属性をサポートしています。本トピックでは、AUTO_INCREMENT
列属性の応用シナリオ、使用方法、および機能について紹介します。
概要
テーブルに新しいデータ行をロードする際、AUTO_INCREMENT
列の値が指定されていない場合、StarRocksはその行のAUTO_INCREMENT
列に整数値を自動的に割り当てます。この整数値はテーブル全体で一意のIDとして機能します。AUTO_INCREMENT
列の後続の値は、行のIDから特定のステップで自動的に増加します。AUTO_INCREMENT
列はデータ管理を簡素化し、一部のクエリの実行速度を向上させるために使用できます。以下はAUTO_INCREMENT
列の応用シナリオの例です。
- 主キーとして使用する:
AUTO_INCREMENT
列は主キーとして使用 して、各行に一意のIDがあることを保証し、データのクエリと管理を容易にします。 - テーブルの結合:複数のテーブルを結合する際、
AUTO_INCREMENT
列は結合キーとして使用できます。これは、データ型がSTRING(UUIDなど)である列を使用する場合よりもクエリの処理を高速化できます。 - ハイカーディナリティ列の一意な値の数をカウントする:
AUTO_INCREMENT
列を使用して辞書内の一意な値列を表すことができます。直接的にSTRINGの値を数えるよりも、AUTO_INCREMENT
列の一意な整数値を数えることで、クエリの処理速度を数倍または十数倍向上させることができる場合があります。
AUTO_INCREMENT
列は、CREATE TABLEステートメントで明示的に指定する必要があります。AUTO_INCREMENT
列のデータ型はBIGINTでなければなりません。AUTO_INCREMENT列の値は、1から始まり、新しい行ごとに1ずつ増加します。
基本操作
テーブル作成時にAUTO_INCREMENT
列を指定する
number
列をAUTO_INCREMENT
列として指定して、名前がtest_tbl1
のテーブルを作成します。
CREATE TABLE test_tbl1
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
AUTO_INCREMENT
列に値を割り当てる
暗黙的な値の割り当て
StarRocksテーブルにデータをロードする際は、AUTO_INCREMENT
列の値を指定する必要はありません。StarRocksは自動的にユニークな整数値をその列に割り当て、テーブルに挿入します。
INSERT INTO test_tbl1 (id) VALUES (1);
INSERT INTO test_tbl1 (id) VALUES (2);
INSERT INTO test_tbl1 (id) VALUES (3),(4),(5);
テーブルのデータを表示します。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+------+--------+
5 rows in set (0.02 sec)
StarRocksテーブルにデータをロードする際、AUTO_INCREMENT
列の値をDEFAULT
として指定することもできます。StarRocksは自動的にユニークな整数値をその列に割り当て、テーブルに挿入します 。
INSERT INTO test_tbl1 (id, number) VALUES (6, DEFAULT);
テーブルのデータを表示します。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
+------+--------+
6 rows in set (0.02 sec)
実際の使用では、テーブルのデータを表示する際に以下のような結果が返されることもあります。これは、StarRocksがAUTO_INCREMENT
列の値を厳密に単調増加させることを保証できないためです。ただし、StarRocksは値がおおよそ時系列で増加することを保証することができます。詳細については、単調性を参照してください。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
+------+--------+
6 rows in set (0.01 sec)
明示的な値の指定
AUTO_INCREMENT
列の値を明示的に指定して、テーブルに挿入することもできます。
INSERT INTO test_tbl1 (id, number) VALUES (7, 100);
-- テーブルのデータを表示します。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
+------+--------+
7 rows in set (0.01 sec)
また、明示的に値を指定しても、StarRocksは新しく挿入されるデータ行のAUTO_INCREMENT
列の値を生成することには影響しません。
INSERT INTO test_tbl1 (id) VALUES (8);
-- テーブルのデータを表示します。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
| 8 | 2 |
+------+--------+
8 rows in set (0.01 sec)
注記
AUTO_INCREMENT
列の値を暗黙的に割り当てる方法と明示的に指定する方法を同時に使用することはお勧めしません。StarRocksが生成する値と指定された値が同じになる可能性があるため、自動生成されたIDの一意性が壊れる可能性があります。
基本機能
一意性
一般的に、StarRocksはAUTO_INCREMENT
列の値がテーブル全体で一意であることを保証します。AUTO_INCREMENT
列の値を暗黙的に割り当てる方法と明示的に指定する方法を同時に使用しないようにお勧 めします。それを行うと、自動生成されたIDの一意性が壊れる可能性があります。以下は簡単な例です。名前がtest_tbl2
のテーブルを作成し、number
列をAUTO_INCREMENT
列として指定します。
CREATE TABLE test_tbl2
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
テーブルtest_tbl2
に対してAUTO_INCREMENT
列のnumber
に対して暗黙的な値と明示的に指定した値を割り当てます。
INSERT INTO test_tbl2 (id, number) VALUES (1, DEFAULT);
INSERT INTO test_tbl2 (id, number) VALUES (2, 2);
INSERT INTO test_tbl2 (id) VALUES (3);
テーブルtest_tbl2
のクエリを実行します。
mysql > SELECT * FROM test_tbl2 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 100001 |
+------+--------+
3 rows in set (0.08 sec)
単調性
自動生成されたIDの割り当てパフォーマンスを向上させるために、BEは一部の自動生成されたIDをローカルにキャッシュします。この状況下では、StarRocksはAUTO_INCREMENT
列の値が厳密に単調であることを保証することができません。ほぼ時系列で値が増加することだけを保証できます。
注記
BEがキャッシュする自動生成されたIDの数は、FEの動的パラメータ
auto_increment_cache_size
で決まります。デフォルト値は100,000
です。ADMIN SET FRONTEND CONFIG("auto_increment_cache_size" = "xxx")
を使用して値を変更できます。
例えば、StarRocksクラスタにFEノードが1つとBEノードが2つあるとします。test_tbl3
という名前のテーブルを作成し、次のように5行のデータを挿入します。
CREATE TABLE test_tbl3
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
INSERT INTO test_tbl3 VALUES (1, DEFAULT);
INSERT INTO test_tbl3 VALUES (2, DEFAULT);
INSERT INTO test_tbl3 VALUES (3, DEFAULT);
INSERT INTO test_tbl3 VALUES (4, DEFAULT);
INSERT INTO test_tbl3 VALUES (5, DEFAULT);
test_tbl3
テーブルのAUTO_INCREMENT
列は単調増加ではないため、BEノードは自動生成されたIDをキャッシュしています。BEノードごとに異なるIDが割り当てられるため、自動生成されたIDが厳密に単調ではないことは保証されません。
mysql > SELECT * FROM test_tbl3 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 2 |
| 5 | 100002 |
+------+--------+
5 rows in set (0.07 sec)
部分変更とAUTO_INCREMENT
列
このセクションでは、AUTO_INCREMENT
列が含まれるテーブルの一部の指定された列のみを更新する方法について説明します。
注記
現在、部分更新はプライマリキーテーブルのみサポートされています。
AUTO_INCREMENT
列がプライマリキーの場合
部分更新時には、プライマリキーを指定する必要があります。そのため、AUTO_INCREMENT
列がプライマリキーまたはプライマリキーの一部である場合、部分更新時のユーザーの操作は、AUTO_INCREMENT
列が定義されていない場合とまったく同じです。
-
example_db
データベース内のtest_tbl4
という名前のテーブルを作成し、1つのデータ行を挿入します。-- テーブルを作成します。
CREATE TABLE test_tbl4
(
id BIGINT AUTO_INCREMENT,
name BIGINT NOT NULL,
job1 BIGINT NOT NULL,
job2 BIGINT NOT NULL
)
PRIMARY KEY (id, name)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
-- データを準備します。
mysql > INSERT INTO test_tbl4 (id, name, job1, job2) VALUES (0, 0, 1, 1);
Query OK, 1 row affected (0.04 sec)
{'label':'insert_6af28e77-7d2b-11ed-af6e-02424283676b', 'status':'VISIBLE', 'txnId':'152'}
-- テーブルのデータをクエリします。
mysql > SELECT * FROM test_tbl4 ORDER BY id;
+------+------+------+------+
| id | name | job1 | job2 |
+------+------+------+------+
| 0 | 0 | 1 | 1 |
+------+------+------+------+
1 row in set (0.01 sec) -
テーブル
test_tbl4
を更新するためのCSVファイルmy_data4.csvを準備します。CSVファイルにはAUTO_INCREMENT
列の値が含まれており、カラムjob1
の値は含まれていません。最初の行のプライマリキーはすでにテーブルtest_tbl4
に存在し、2番目の行のプライマリキーはテーブルに存在しません。0,0,99
1,1,99 -
Stream Loadジョブを実行し、CSVファイルを使用してテーブル
test_tbl4
を更新します。curl --location-trusted -u <username>:<password> -H "label:1" \
-H "column_separator:," \
-H "partial_update:true" \
-H "columns:id,name,job2" \
-T my_data4.csv -XPUT \
http://<fe_host>:<fe_http_port>/api/example_db/test_tbl4/_stream_load -
更新されたテーブルをクエリします。データの最初の行はすでにテーブル
test_tbl4
に存在するため、AUTO_INCREMENT
列のjob1
の値は変更されずに残ります。データの2番目の行は新たに挿入され、列job1
のデフォルト値が指定されていないため、部分更新フレームワークはこの列の値を0
に直接設定します。mysql > SELECT * FROM test_tbl4 ORDER BY id;
+------+------+------+------+
| id | name | job1 | job2 |
+------+------+------+------+
| 0 | 0 | 1 | 99 |
| 1 | 1 | 0 | 99 |
+------+------+------+------+
2 rows in set (0.01 sec)
AUTO_INCREMENT
列がプライマリキーでない場合
AUTO_INCREMENT
列がプライマリキーまたはプライマリキーの一部でなく、STREAM_LOADジョブで自動生成されたIDが提供されない場合は、次の状況が発生します。
- データ行がテーブル内に既に存在する場合、StarRocksは
AUTO_INCREMENT
列の値を更新しません。 - データ行がテーブルに新たにロードされる場合、StarRocksは
AUTO_INCREMENT
列に新しい値を生成します。
この機能は、辞書テーブルを構築してSTRINGの一意な値を高速に計算するために使用することができます。
-
example_db
データベース内でtest_tbl5
という名前のテーブルを作成し、データ行を1つ挿入します。カラムjob1
をAUTO_INCREMENT
列として指定します。-- テーブルを作成します。
CREATE TABLE test_tbl5
(
id BIGINT NOT NULL,
name BIGINT NOT NULL,
job1 BIGINT NOT NULL AUTO_INCREMENT,
job2 BIGINT NOT NULL
)
PRIMARY KEY (id, name)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
-- データを準備します。
mysql > INSERT INTO test_tbl5 VALUES (0, 0, -1, -1);
Query OK, 1 row affected (0.04 sec)
{'label':'insert_458d9487-80f6-11ed-ae56-aa528ccd0ebf', 'status':'VISIBLE', 'txnId':'94'}
-- テーブルのデータをクエリします。
mysql > SELECT * FROM test_tbl5 ORDER BY id;
+------+------+--------+------+
| id | name | job1 | job2 |
+------+------+--------+------+
| 0 | 0 | -1 | -1 |
+------+------+--------+------+
1 row in set (0.01 sec) -
テーブル
test_tbl5
を更新するためのCSVファイルmy_data5.csvを準備します。CSVファイルにはAUTO_INCREMENT
列job1
の値は含まれていません。最初の行のプライマリキーはテーブルtest_tbl5
にすでに存在しますが、2 番目と3番目の行のプライマリキーはテーブルに存在しません。0,0,99
1,1,99
2,2,99 -
Stream Loadジョブを実行し、CSVファイルのデータをテーブル
test_tbl5
にロードします。curl --location-trusted -u <username>:<password> -H "label:2" \
-H "column_separator:," \
-H "partial_update:true" \
-H "columns: id,name,job2" \
-T my_data5.csv -XPUT \
http://<fe_host>:<fe_http_port>/api/example_db/test_tbl5/_stream_load -
更新されたテーブルをクエリします。データの最初の行はすでにテーブル
test_tbl5
に存在するため、AUTO_INCREMENT
列のjob1
の値は変更されずに残ります。データの2番目と3番目の行は新たに挿入され、StarRocksはAUTO_INCREMENT
列job1
のために新しい値を生成します。mysql > SELECT * FROM test_tbl5 ORDER BY id;
+------+------+--------+------+
| id | name | job1 | job2 |
+------+------+--------+------+
| 0 | 0 | -1 | 99 |
| 1 | 1 | 1 | 99 |
| 2 | 2 | 100001 | 99 |
+------+------+--------+------+
3 rows in set (0.01 sec)
制約事項
AUTO_INCREMENT
列を持つテーブルを作成する際には、'replicated_storage' = 'true'
を設定する必要があります。これにより、すべてのレプリカが同じ自動生成されたIDを持つようになります。- テーブルごとに1つの
AUTO_INCREMENT
列のみ使用できます。 AUTO_INCREMENT
列のデータ型はBIGINTでなければなりません。AUTO_INCREMENT
列はNOT NULL
である必要があり、デフォルト値を持つことはありません。AUTO_INCREMENT
属性を使用したALTER TABLEはサポートされていません。- StarRocksの共有データモードは、バージョン3.1以降、
AUTO_INCREMENT
属性に対応しています。 AUTO_INCREMENT
列の開始値と増分の指定はサポートされていません。
キーワード
AUTO_INCREMENT, AUTO INCREMENT