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

Tablestore:条件付き更新

最終更新日:Aug 19, 2025

このトピックでは、Tablestore SDK for Java で条件付き更新を使用する方法について説明します。更新条件を設定すると、指定された条件が満たされた場合にのみ、ターゲット行が更新されます。

前提条件

クライアントの初期化

説明

Condition クラスは次のように宣言されています。

public class Condition {
    private RowExistenceExpectation rowExistenceExpectation;
    private ColumnCondition columnCondition;
    
    // メソッド宣言
}

プロパティ

  • rowExistenceExpectation (オプション): 行存在条件。次の 3 つのタイプを使用できます。

    • IGNORE (デフォルト): 行が存在するかどうかを確認しません。

    • EXPECT_EXIST: ターゲット行がデータテーブルに存在する場合、条件が満たされます。

    • EXPECT_NOT_EXIST: ターゲット行がデータテーブルに存在しない場合、条件が満たされます。

  • columnCondition (オプション): 列値条件。次の 2 つのタイプを使用できます。

    • SingleColumnValueCondition: 単一の属性列の値が指定された条件を満たすかどうかを確認します。次の表にパラメーターを示します。

      パラメーター

      タイプ

      説明

      operator (必須)

      CompareOperator

      関係演算子。有効な値: EQUAL、NOT_EQUAL、GREATER_THAN、GREATER_EQUAL、LESS_THAN、LESS_EQUAL。

      columnName (必須)

      String

      確認する属性列の名前。

      columnValue (必須)

      ColumnValue

      照合する値。

      passIfMissing (オプション)

      Boolean

      行にターゲット属性列が含まれていない場合に条件が満たされるかどうかを指定します。デフォルト値: true。行に列が含まれていない場合、条件は満たされます。

      latestVersionsOnly (オプション)

      Boolean

      最新のデータバージョンのみを確認するかどうかを指定します。デフォルト値: true。ターゲット属性列に複数のバージョンがある場合、最新バージョンの値のみが確認されます。

    • CompositeColumnValueCondition: 行データが指定された複合条件を満たすかどうかを確認します。次の表にパラメーターを示します。

      パラメーター

      タイプ

      説明

      type (必須)

      LogicOperator

      論理演算子。有効な値: NOT、AND、OR。

      conditions (必須)

      List<ColumnCondition>

      論理演算のサブ条件のリスト。

      • サブ条件は、SingleColumnValueCondition または CompositeColumnValueCondition にすることができます。

      • 最大 32 個の条件を組み合わせることができます。

サンプルコード

次のコード例は、updateRow メソッドを使用して条件付き更新を実行する方法を示しています。

public static void setConditionExample(SyncClient client) {
    // 更新データを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    RowUpdateChange rowUpdateChange = new RowUpdateChange("test_condition", primaryKey);
    rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));

    // 更新条件を構築します。
    Condition condition = new Condition();
    // ターゲット行がデータテーブルに存在する場合にのみデータを更新します。
    condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
    rowUpdateChange.setCondition(condition);

    // リクエストを構築し、updateRow メソッドを呼び出してデータを更新します。
    UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
    UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);

    // レスポンスを処理します。
    System.out.println("* RequestId: " + updateRowResponse.getRequestId());
    System.out.println("* Read CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
    System.out.println("* Write CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
}
  • 単一の属性列の値が指定された条件を満たすかどうかを確認するために、列値条件を設定します。

    // col1 列の値が val1 の場合にのみデータを更新します。
    SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val1"));
    condition.setColumnCondition(singleColumnValueCondition);
  • 複数のサブ条件を確認するために、列値条件を設定します。

    // 複合条件 1 を設定します。
    CompositeColumnValueCondition compositeColumnValueCondition1 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND);
    // サブ条件を追加します。
    SingleColumnValueCondition singleColumnValueCondition1 = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val1"));
    compositeColumnValueCondition1.addCondition(singleColumnValueCondition1);
    SingleColumnValueCondition singleColumnValueCondition2 = new SingleColumnValueCondition("col2", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val2"));
    compositeColumnValueCondition1.addCondition(singleColumnValueCondition2);
    // 複合条件 2 を設定します。
    CompositeColumnValueCondition compositeColumnValueCondition2 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR);
    // サブ条件を追加します。
    compositeColumnValueCondition2.addCondition(compositeColumnValueCondition1);
    SingleColumnValueCondition singleColumnValueCondition3 = new SingleColumnValueCondition("col3", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString("val3"));
    compositeColumnValueCondition2.addCondition(singleColumnValueCondition3);
    // 複合条件を追加します。条件は (col1 = val1 and col2 = val2) or (col3 = val3) です。
    condition.setColumnCondition(compositeColumnValueCondition2);

ユースケース

次のコードサンプルは、条件付き更新機能を使用して、楽観的ロックの比較とスワップ (CAS) 操作をシミュレートする方法を示しています。

public static void OptimisticLocking(SyncClient client) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();

    // 属性列の元の値を読み取ります。
    SingleRowQueryCriteria singleRowQueryCriteria = new SingleRowQueryCriteria("test_condition", primaryKey);
    singleRowQueryCriteria.setMaxVersions(1);
    GetRowRequest getRowRequest = new GetRowRequest(singleRowQueryCriteria);
    GetRowResponse getRowResponse = client.getRow(getRowRequest);
    String oldValue = getRowResponse.getRow().getLatestColumn("col1").getValue().asString();

    // データを更新します。
    RowUpdateChange rowUpdateChange = new RowUpdateChange("test_condition", primaryKey);
    rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
    // 更新条件を設定します。ターゲット属性列の最新バージョンが期待値 (読み取り値) と等しい場合にのみ更新が実行されます。
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("col1", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromString(oldValue));
    singleColumnValueCondition.setPassIfMissing(false);
    singleColumnValueCondition.setLatestVersionsOnly(true);
    condition.setColumnCondition(singleColumnValueCondition);
    rowUpdateChange.setCondition(condition);

    // リクエストを構築し、updateRow メソッドを呼び出してデータを更新します。
    UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
    UpdateRowResponse updateRowResponse = client.updateRow(updateRowRequest);

    // レスポンスを処理します。
    System.out.println("* RequestId: " + updateRowResponse.getRequestId());
    System.out.println("* Read CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
    System.out.println("* Write CU Cost: " + updateRowResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
}