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

Tablestore:条件付き更新の使用

最終更新日:Aug 06, 2026

Tablestore SDK for Java は、ターゲット行が指定された条件を満たす場合にのみ、行の書き込み、更新、または削除を実行します。

前提条件

Tablestore SDK for Java をインストールし、クライアントを初期化します。

説明

Condition コンテナーは、行の存在条件 (rowExistenceExpectation)、列条件 (columnCondition)、またはその両方を保持します。設定された条件を setCondition() の RowPutChange、RowUpdateChange、または RowDeleteChange に渡します。これらの行の変更は、BatchWriteRow リクエストに含めることもできます。条件が満たされない場合、サーバーはエラーを返し、行は変更されません。

rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)

次の例では、condition_demo テーブルのプライマリキーが row1 である行を行が存在する場合にのみ更新します。 それ以外の場合、サーバーはエラーを返します。

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));

Condition condition = new Condition();
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);

client.updateRow(new UpdateRowRequest(rowUpdateChange));

パラメーター

更新条件

Condition には、次のパラメーターが含まれています。行の存在条件と列条件は、個別に使用することも、組み合わせて使用することもできます。rowExistenceExpectation が IGNORE で、columnCondition が設定されていない場合、条件は評価されません。

名前

タイプ

説明

rowExistenceExpectation (任意)

RowExistenceExpectation

行の存在条件。有効な値は次のとおりです。

  • IGNORE (デフォルト): 行の存在チェックをスキップします。

  • EXPECT_EXIST: 対象の行がテーブルに存在する場合に一致します。

  • EXPECT_NOT_EXIST: 対象の行がテーブルに存在しない場合に一致します。

columnCondition (任意)

ColumnCondition

列条件です。サブクラスには、単一列チェック用の SingleColumnValueCondition と、複合チェック用の CompositeColumnValueCondition があります。

単一列の値の条件

Condition.columnCondition が SingleColumnValueCondition である場合、以下のパラメーターが含まれます。

名前

タイプ

説明

columnName (必須)

String

チェックする属性列の名前。

operator (必須)

CompareOperator

比較演算子。有効な値は次のとおりです。

  • EQUAL

  • 等しくない

  • GREATER_THAN

  • GREATER_EQUAL

  • 未満

  • LESS_EQUAL

columnValue (必須)

ColumnValue

比較する値。

passIfMissing (任意)

boolean

対象の属性列が存在しない場合に、その行が条件を満たすとみなすかどうか。デフォルト: true (列が存在しない場合は条件を満たすとみなされます)。

欠落した列を条件を満たさないものとして扱うには、false に設定します。

latestVersionsOnly (任意)

boolean

最新のデータバージョンのみを確認するかどうか。デフォルト: true。

いずれかのバージョンが条件を満たす場合に一致させるには、falseに設定します。

複合条件

Condition.columnCondition が CompositeColumnValueCondition の場合、以下のパラメーターが含まれます。addCondition() でサブ条件を追加します。サブ条件は最大 32 個まで追加できます。

名前

タイプ

説明

logicOperator (必須)

LogicOperator

論理演算子。有効な値は次のとおりです。

  • AND。2つ以上のサブ条件を追加します。

  • OR:少なくとも 2 つのサブ条件を追加します。

  • NOT。厳密に 1 つのサブ条件を追加します。

conditions (必須)

List<ColumnCondition>

論理演算のサブ条件です。各サブ条件は addCondition() で追加します。サブ条件は SingleColumnValueCondition または別の CompositeColumnValueCondition のいずれかであり、複合形式を使用して条件をネストします。

例

単一列の値の条件

SingleColumnValueCondition を使用して、単一の属性列の値をチェックします。 次の例では、col1 == "changed_val1" の場合にのみ、プライマリキーが row1 の行の col2 を更新します。

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col2", ColumnValue.fromString("new_val2"));

Condition condition = new Condition();
SingleColumnValueCondition singleCondition = new SingleColumnValueCondition(
        "col1",
        SingleColumnValueCondition.CompareOperator.EQUAL,
        ColumnValue.fromString("changed_val1"));
condition.setColumnCondition(singleCondition);
rowUpdateChange.setCondition(condition);

client.updateRow(new UpdateRowRequest(rowUpdateChange));

複合列の値の条件

CompositeColumnValueCondition を使用して、論理演算子で複数の条件を組み合わせます。 複合条件は入れ子にすることができます。 次の例では、(col1 == "changed_val1" AND col2 == "new_val2") OR (col3 == "val3") という条件を構築します。

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("final_val1"));

// サブ条件: col1 == "changed_val1" AND col2 == "new_val2"
CompositeColumnValueCondition andCondition = new CompositeColumnValueCondition(
        CompositeColumnValueCondition.LogicOperator.AND);
andCondition.addCondition(new SingleColumnValueCondition(
        "col1",
        SingleColumnValueCondition.CompareOperator.EQUAL,
        ColumnValue.fromString("changed_val1")));
andCondition.addCondition(new SingleColumnValueCondition(
        "col2",
        SingleColumnValueCondition.CompareOperator.EQUAL,
        ColumnValue.fromString("new_val2")));

// トップレベルの OR: (col1 AND col2) OR (col3)
CompositeColumnValueCondition orCondition = new CompositeColumnValueCondition(
        CompositeColumnValueCondition.LogicOperator.OR);
orCondition.addCondition(andCondition);
orCondition.addCondition(new SingleColumnValueCondition(
        "col3",
        SingleColumnValueCondition.CompareOperator.EQUAL,
        ColumnValue.fromString("val3")));

Condition condition = new Condition();
condition.setColumnCondition(orCondition);
rowUpdateChange.setCondition(condition);

client.updateRow(new UpdateRowRequest(rowUpdateChange));

同時上書きの防止

条件付き更新を使用して Compare-and-Swap を実装します:まず現在の値を読み取り、それを更新条件として渡します。更新は、列が読み取った値と依然として同じである場合にのみ成功します。読み取りと書き込みの間に別のプロセスが列を変更した場合、更新は失敗します。これにより、そのプロセスの書き込みを上書きしてしまうことを防ぎます。

PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
        .addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
        .build();

// 1. 現在の値を読み取ります。
SingleRowQueryCriteria queryCriteria = new SingleRowQueryCriteria("condition_demo", primaryKey);
queryCriteria.setMaxVersions(1);
GetRowResponse getResponse = client.getRow(new GetRowRequest(queryCriteria));
String oldValue = getResponse.getRow().getLatestColumn("col1").getValue().asString();

// 2. 読み取った値に基づいて条件付き更新を実行します (col1 がまだ oldValue と等しい場合にのみ更新) 。
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("cas_updated"));

Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
SingleColumnValueCondition casCondition = new SingleColumnValueCondition(
        "col1",
        SingleColumnValueCondition.CompareOperator.EQUAL,
        ColumnValue.fromString(oldValue));
casCondition.setPassIfMissing(false);
casCondition.setLatestVersionsOnly(true);
condition.setColumnCondition(casCondition);
rowUpdateChange.setCondition(condition);

client.updateRow(new UpdateRowRequest(rowUpdateChange));