メインコンテンツまでスキップ

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列が定義されていない場合とまったく同じです。

  1. 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)
  2. テーブルtest_tbl4を更新するためのCSVファイルmy_data4.csvを準備します。CSVファイルにはAUTO_INCREMENT列の値が含まれており、カラムjob1の値は含まれていません。最初の行のプライマリキーはすでにテーブルtest_tbl4に存在し、2番目の行のプライマリキーはテーブルに存在しません。

    0,0,99
    1,1,99
  3. 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
  4. 更新されたテーブルをクエリします。データの最初の行はすでにテーブル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の一意な値を高速に計算するために使用することができます。

  1. example_dbデータベース内でtest_tbl5という名前のテーブルを作成し、データ行を1つ挿入します。カラムjob1AUTO_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)
  2. テーブルtest_tbl5を更新するためのCSVファイルmy_data5.csvを準備します。CSVファイルにはAUTO_INCREMENTjob1の値は含まれていません。最初の行のプライマリキーはテーブルtest_tbl5にすでに存在しますが、2番目と3番目の行のプライマリキーはテーブルに存在しません。

    0,0,99
    1,1,99
    2,2,99
  3. 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
  4. 更新されたテーブルをクエリします。データの最初の行はすでにテーブルtest_tbl5に存在するため、AUTO_INCREMENT列のjob1の値は変更されずに残ります。データの2番目と3番目の行は新たに挿入され、StarRocksはAUTO_INCREMENTjob1のために新しい値を生成します。

    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