全部產品
Search
文件中心

Tablestore:條件更新

更新時間:Aug 16, 2025

本文介紹如何在 Java SDK 中使用條件更新,設定更新條件後,只有目標行資料滿足指定的條件,才能完成更新。

前提條件

初始化Tablestore Client

功能說明

條件更新的類聲明如下:

public class Condition {
    private RowExistenceExpectation rowExistenceExpectation;
    private ColumnCondition columnCondition;
    
    // method declaration
}

屬性說明

  • rowExistenceExpectation(可選):行存在性條件,包括以下三種。

    • IGNORE(預設值):不做行存在性判斷。

    • EXPECT_EXIST:資料表中存在目標行資料時滿足條件,否則不滿足。

    • EXPECT_NOT_EXIST:資料表中不存在目標行資料時滿足條件,否則不滿足。

  • columnCondition(可選):列值判斷條件,包括以下兩種。

    • 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);

    // 構造 Request,調用 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);

    // 構造 Request,調用 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());
}