すべてのプロダクト
Search
ドキュメントセンター

Tablestore:自動インクリメント主キー列の設定

最終更新日:Dec 28, 2024

このトピックでは、自動インクリメント主キー列を設定する方法について説明します。パーティションキーではない主キー列を自動インクリメント主キー列として指定できます。自動インクリメント主キー列を含むテーブルにデータを書き込む場合、Tablestore が自動インクリメント主キー列の値を自動的に生成するため、自動インクリメント主キー列の値を指定する必要はありません。自動インクリメント主キー列に対して生成される値は一意であり、パーティション内で単調に増加します。

重要

Tablestore SDK for Java V4.2.0 以降では、自動インクリメント主キー列を設定できます。

使用上の注意

自動インクリメント主キー列を含むテーブルにデータを書き込む場合は、自動インクリメント主キー列に対して生成された値を返すようにシステムを設定し、後続のデータ更新またはデータ読み取りのために値を記録する必要があります。

前提条件

OTSClient インスタンスが初期化されていること。詳細については、「OTSClient インスタンスの初期化」を参照してください。

手順

  1. テーブルを作成するときに、パーティションキーではない主キー列を自動インクリメント主キー列として指定します。

    INTEGER 型の主キー列のみを自動インクリメント主キー列として指定できます。自動インクリメント主キー列に対して生成される各値は、LONG 型の 64 ビット符号付き整数です。

  2. テーブルにデータを書き込むときは、自動インクリメント主キー列の値を指定する必要はありません。自動インクリメント主キー列の値をプレースホルダーに設定するだけで済みます。

    テーブルにデータが書き込まれた後に自動インクリメント主キー列の値を取得する場合は、ReturnType パラメーターを RT_PK に設定できます。

    テーブルからデータを読み取るときは、すべての主キー列の値を指定する必要があります。すべての主キー列の値を取得するには、PutRow、UpdateRow、または BatchWriteRow 操作を呼び出すときに ReturnType パラメーターを RT_PK に設定します。

    すべての主キー列の値を記録している場合は、GetRow 操作または BatchGetRow 操作を呼び出し、すべての主キー列の値を指定して 1 つ以上のデータ行を読み取ることができます。自動インクリメント主キー列の値を記録していない場合は、GetRange 操作を呼び出して、最初の主キー列の値が特定の範囲内にあるデータを読み取ることができます。

    説明

    既存の行を更新する場合に自動インクリメント主キー列の値を記録していない場合は、データを更新する前に GetRange 操作を呼び出して行の主キー情報を取得します。

  1. 自動インクリメント主キー列を含むテーブルを作成します。

    テーブルの作成時に自動インクリメント主キー列を作成するには、主キー列の属性を AUTO_INCREMENT に設定するだけで済みます。

    次のサンプルコードは、自動インクリメント主キー列を含むテーブルを作成する方法の例を示しています。テーブルには、データ型が STRING の pk1 主キー列と、データ型が INTEGER の pk2 主キー列が含まれています。 pk1 列はパーティションキー列であり、pk2 列は自動インクリメント主キー列です。

    private static void createTable(SyncClient client) {
        // テーブルの名前を指定します。
        TableMeta tableMeta = new TableMeta("<TABLE_NAME>");
        // 最初の主キー列を作成します。最初の主キー列はパーティションキー列です。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("pk1", PrimaryKeyType.STRING));
        // データ型が INTEGER の 2 番目の主キー列を作成し、列の属性を AUTO_INCREMENT に設定します。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("pk2", PrimaryKeyType.INTEGER, PrimaryKeyOption.AUTO_INCREMENT));
        // データの有効期限 (TTL) を指定します。 -1 の値は、データが期限切れにならないことを指定します。単位:秒。
        int timeToLive = -1;  
        // 各列に保持できる最大バージョン数を指定します。 1 の値は、各列の最新バージョンのみが保持されることを指定します。
        int maxVersions = 1; 
        TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
        CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
        client.createTable(request);
    }
  2. テーブルにデータを書き込みます。

    テーブルにデータを書き込むときは、自動インクリメント主キー列の値を指定する必要はありません。自動インクリメント主キー列の値を AUTO_INCREMENT に設定するだけで済みます。

    次のサンプルコードは、テーブルにデータ行を書き込み、すべての主キー列の値と消費された予約済み読み取りおよび書き込みキャパシティユニット (CU) を返す方法の例を示しています。

    private static void putRow(SyncClient client, String receive_id) {
        // 主キーを構築します。
        PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        // 最初の主キー列の値を、データ型が STRING の receive_id パラメーターの値に設定します。
        primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString(receive_id));
        // 2 番目の主キー列は自動インクリメント主キー列であるため、2 番目の主キー列の値を指定する必要はありません。自動インクリメント主キー列の値を AUTO_INCREMENT に設定するだけで済みます。 Tablestore は自動インクリメント主キー列の値を自動的に生成します。
        primaryKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.AUTO_INCREMENT);
        PrimaryKey primaryKey = primaryKeyBuilder.build();
        // テーブルの名前を指定します。
        RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
        // ReturnType パラメーターを RT_PK に設定して、レスポンスにすべての主キー列の値を含めます。デフォルトでは、ReturnType パラメーターを RT_PK に設定しない場合、すべての主キー列の値は返されません。
        rowPutChange.setReturnType(ReturnType.RT_PK);
        // 属性列を追加します。
        rowPutChange.addColumn(new Column("content", ColumnValue.fromString("content")));
        // テーブルにデータを書き込みます。
        PutRowResponse response = client.putRow(new PutRowRequest(rowPutChange));
        // すべての主キー列の値を表示します。
        Row returnRow = response.getRow();
        if (returnRow != null) {
            System.out.println("PrimaryKey:" + returnRow.getPrimaryKey().toString());
        }
        // 消費された CU を表示します。
        CapacityUnit  cu = response.getConsumedCapacity().getCapacityUnit();
        System.out.println("Read CapacityUnit:" + cu.getReadCapacityUnit());
        System.out.println("Write CapacityUnit:" + cu.getWriteCapacityUnit());
    }