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

Tablestore:条件付き更新の実行

最終更新日:Dec 28, 2024

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

前提条件

使用上の注意

PutRowUpdateRowDeleteRow、またはBatchWriteRow 操作を呼び出してデータテーブル内のデータを更新する場合、行の有無条件と列ベースの条件を指定して条件付き更新を実行できます。データテーブル内のデータは、条件が満たされた場合にのみ更新されます。

条件付き更新は、行の有無条件と列ベースの条件に基づいて実行できます。

  • 行の有無条件として、IGNORE、EXPECT_EXIST、EXPECT_NOT_EXIST がサポートされています。

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

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

    列ベースの条件では、=, !=, >, >=, <, <= などの関係演算子がサポートされています。また、NOT、AND、OR などの論理演算子もサポートされています。条件付き更新では、最大 10 個の列ベースの条件を指定できます。

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

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

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

パラメーター

パラメーター

説明

RowExistenceExpectation

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

行の有無条件として、IGNORE、EXPECT_EXIST、EXPECT_NOT_EXIST がサポートされています。

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

  • EXPECT_EXIST: 行が存在することが想定されます。行が存在する場合、条件は満たされます。

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

ColumnName

列の名前。

ColumnValue

列と比較する値。

Operator

値の比較に使用する関係演算子。詳細については、ComparatorType を参照してください。

=, !=, >, >=, <, <= などの関係演算子がサポートされています。

LogicOperator

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

NOT、AND、OR などの論理演算子がサポートされています。

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

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

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

PassIfMissing

行に列が存在しない場合に条件チェックに合格するかどうかを指定します。このパラメーターの値はブール型です。デフォルト値は 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);
    }