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

Tablestore:条件付き更新の実行

最終更新日:Aug 14, 2026

条件付き更新機能を使用すると、指定された条件が満たされた場合にのみ、データテーブル内のデータを更新できます。条件が満たされない場合、更新は失敗します。

前提条件

注意事項

PutRowUpdateRowDeleteRow、または BatchWriteRow オペレーションを呼び出してデータテーブル内のデータを更新する場合、行の存在条件および列条件を指定して条件付き更新を実行できます。データテーブル内のデータは、条件が満たされた場合にのみ更新されます。

条件付き更新は、行の存在条件と列条件に基づいて実行できます。

  • 次の行の存在条件がサポートされています:IGNOREEXPECT_EXISTEXPECT_NOT_EXIST

    データテーブルを更新する際、Tablestore はまず行の存在条件が満たされているかどうかを確認します。行の存在条件が満たされていない場合、更新は失敗し、エラーが報告されます。

  • 列条件には RelationalConditionCompositeCondition が含まれ、1 つ以上の列の値に基づいて条件が満たされているかどうかを判断するために使用されます。

    列条件は、次の関係演算子をサポートしています:=!=>>=<<=。列条件は、次の論理演算子もサポートしています:NOTANDOR。条件付き更新には、最大 10 個の列条件を指定できます。

    • RelationalCondition を使用すると、列と定数を比較できます。2 つの列または 2 つの定数の比較はサポートされていません。

    • CompositeCondition は、複数の RelationalCondition または CompositeCondition で構成されます。サブ条件間の論理関係を指定する必要があります。

条件付き更新を使用して、オプティミスティックロックを実装できます。行を更新する場合、特定の列の値を取得し、その列の値に基づいて行の更新条件を指定する必要があります。たとえば、行内の列 A の値を 2 に更新する場合、列 A の値を取得する必要があります。この例では、取得した値は 1 です。次に、列 A の値が 1 の場合にのみ行が更新されるよう指定する必要があります。指定された条件が満たされている場合、更新は成功します。行が別のクライアントによって更新された場合、更新は失敗します。

パラメーター

パラメーター

説明

RowExistenceExpectation

データテーブルを更新する際、Tablestore はまず行の存在条件が満たされているかどうかを確認します。行の存在条件が満たされていない場合、更新は失敗し、エラーが報告されます。

次の行の存在条件がサポートされています:IGNOREEXPECT_EXISTEXPECT_NOT_EXIST

  • IGNORE:行の存在は無視されます。行の存在チェックは実行されません。

  • EXPECT_EXIST:行が存在することを前提とします。行が存在する場合、条件が満たされます。

  • EXPECT_NOT_EXIST:行が存在しないことを前提とします。行が存在しない場合、条件が満たされます。

ColumnName

列の名前。

ColumnValue

列と比較する値。

Operator

値を比較するために使用される関係演算子です。詳細については、「ComparatorType」をご参照ください。

次の関係演算子がサポートされています:=!=>>=<<=

LogicOperator

複数の条件を組み合わせるために使用される論理演算子。詳細については、「論理演算子」をご参照ください。

次の論理演算子がサポートされています:NOTANDOR

必要なサブ条件の数は、論理演算子によって異なります。

  • 論理演算子が NOT の場合、サブ条件を 1 つだけ追加できます。

  • 論理演算子が AND または OR の場合、少なくとも 2 つのサブ条件を追加する必要があります。

PassIfMissing

行に列が存在しない場合に条件チェックを通過するかどうかを指定します。このパラメーターの値はブールデータ型です。デフォルト値は false です。これは、列が行に存在しない場合、条件チェックが失敗することを意味します。このパラメーターを true に設定すると、列が行に存在しない場合でも条件チェックは成功します。

PassIfMissing パラメーターが false に設定されている場合、行に列が存在しないと条件チェックは失敗します。

LatestVersionsOnly

列に複数のバージョンの値がある場合に、最新バージョンの値のみを使用するかどうかを指定します。このパラメーターの値はブールデータ型です。デフォルト値は true です。これは、列に複数のバージョンのデータがある場合、最新バージョンの値のみが比較に使用されることを意味します。

LatestVersionsOnly パラメーターが false に設定されている場合、列に複数のバージョンのデータがある場合は、すべてのバージョンの列値が比較に使用されます。この場合、いずれかのバージョンの値が条件を満たすと、条件は満たされます。

次のサンプルコードは、列条件に基づいてデータを更新する方法の例を示しています。col0 列の値が 5 に等しい場合、データが更新されます。それ以外の場合、データの更新は失敗します。

    // 行のプライマリキーを指定します。プライマリキーは、テーブルの作成時に `TableMeta` で指定されたプライマリキーと同じである必要があります。
    PrimaryKey primaryKey = new PrimaryKey();
    primaryKey.Add("pk0", new ColumnValue(0));
    primaryKey.Add("pk1", new ColumnValue("abc"));

    // 行の属性列を指定します。
    AttributeColumns attribute = new AttributeColumns();
    attribute.Add("col0", new ColumnValue(0));
    attribute.Add("col1", new ColumnValue("a"));
    attribute.Add("col2", new ColumnValue(true));

    PutRowRequest request = new PutRowRequest(tableName, new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute);

    // 他の条件が設定されていない場合に `PutRow` オペレーションを呼び出します。オペレーションは成功することが期待されます。
    try
    {
        otsClient.PutRow(request);

        Console.WriteLine("Put row succeeded.");
    } catch (Exception ex)
    {
        Console.WriteLine("Put row failed. error:{0}", ex.Message);
    }

    // `col0` 列の値が `5` に等しくない場合、`PutRow` オペレーションを再度呼び出して元の値を上書きします。オペレーションは成功することが期待されます。
    try
    {
        request.Condition.ColumnCondition = new RelationalCondition("col0",
                                            CompareOperator.NOT_EQUAL,
                                            new ColumnValue(5));
        otsClient.PutRow(request);

        Console.WriteLine("Put row succeeded.");
    } catch (Exception ex)
    {
        Console.WriteLine("Put row failed. error:{0}", ex.Message);
    }

    // `col0` 列の値が `5` に等しい場合、`PutRow` オペレーションを再度呼び出して元の値を上書きします。オペレーションは失敗することが期待されます。
    try
    {
        // `col0` 列の値が `5` に等しいという新しい条件を追加します。
        request.Condition.ColumnCondition = new RelationalCondition("col0",
                                            CompareOperator.EQUAL,
                                            new ColumnValue(5));
        otsClient.PutRow(request);

        Console.WriteLine("Put row succeeded.");
    }
    catch (OTSServerException)
    {
        // 条件が満たされていないため、`OTSServerException` が返されます。
        Console.WriteLine("Put row failed  because condition check failed. but expected");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Put row failed. error:{0}", ex.Message);
    }