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

Tablestore:条件付き更新の設定

最終更新日:Dec 28, 2024

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

説明

条件付き更新機能の使用時に発生する可能性のあるエラーについては、エラーコードを参照してください。

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。

  • データテーブルが作成され、データがデータテーブルに書き込まれていること。

使用上の注意

PutRow、UpdateRow、DeleteRow、または BatchWriteRow 操作を呼び出してデータを更新する場合、条件付き更新を使用して行の有無の条件と列ベースの条件を確認できます。条件が満たされた場合にのみ、更新は成功します。

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

  • 行の有無の条件には、IGNORE、EXPECT_EXIST、および EXPECT_NOT_EXIST が含まれます。

    データテーブルを変更する場合、Tablestore は最初に、行の有無の条件を確認します。行の有無の条件が満たされない場合、変更は失敗し、エラーが報告されます。

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

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

    • SingleColumnCondition は、定数と列の比較をサポートしています。列は主キー列にすることができます。SingleColumnCondition は、2 つの列と 2 つの定数の比較をサポートしていません。

    • 論理演算子は、CompositeCondition のサブ条件を組み合わせるために使用されます。サブ条件は、SingleColumnCondition または CompositeCondition にすることができます。

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

パラメーター

パラメーター

説明

RowExistenceExpectation

行の有無の条件。テーブルを変更する場合、Tablestore は行の有無の条件を確認します。行の有無の条件が満たされない場合、変更は失敗し、エラーが報告されます。

行の有無の条件には、IGNORE、EXPECT_EXIST、および EXPECT_NOT_EXIST が含まれます。Tablestore では、RowExistenceExpectation_IGNORE は IGNORE を、RowExistenceExpectation_EXPECT_EXIST は EXPECT_EXIST を、RowExistenceExpectation_EXPECT_NOT_EXIST は EXPECT_NOT_EXIST を示します。

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

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

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

column_name

列の名前。

column_value

列の比較値。

comparator

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

関係演算子には、EQUAL(=), NOT_EQUAL(!=), GREATER_THAN(>), GREATER_EQUAL(>=), LESS_THAN(<), LESS_EQUAL(<=) が含まれます。Tablestore では、CT_EQUAL は EQUAL(=), CT_NOT_EQUAL は NOT_EQUAL(!=), CT_GREATER_THAN は GREATER_THAN(>), CT_GREATER_EQUAL は GREATER_EQUAL(>=), CT_LESS_THAN は LESS_THAN(<), CT_LESS_EQUAL は LESS_EQUAL(<=) を示します。

combinator

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

論理演算子には、NOT、AND、および OR が含まれます。Tablestore では、LO_NOT は NOT を、LO_AND は AND を、LO_OR は OR を示します。

指定できるサブ条件の数は、使用する論理演算子によって異なります。

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

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

pass_if_missing

行に列が存在しない場合に条件チェックをパスするかどうかを指定します。種類: ブール値。有効な値:

  • True: 行に列が存在しない場合に条件チェックをパスします。これはデフォルト値です。

  • False: 行に列が存在しない場合に条件チェックをパスしません。

latest_version_only

列に複数のバージョンの値がある場合に、比較に最新バージョンの値のみを使用するかどうかを指定します。種類: ブール値。有効な値:

  • True: 列に複数のバージョンの値がある場合に、比較に最新バージョンの値のみを使用します。これはデフォルト値です。

  • False: 列に複数のバージョンの値がある場合に、比較にすべてのバージョンの値を使用します。値のいずれかのバージョンが条件を満たす場合、条件チェックはパスします。

次のサンプルコードは、指定された主キーに基づいてデータの行を更新するために条件付き更新機能を設定する方法の例を示しています。この例では、行が存在し、age 列の値が 20 の場合にのみ更新が成功します。行が存在しない場合、または age 列の値が 20 でない場合、更新は失敗します。

def update_row_with_condition(client):
    table_name = "<TABLE_NAME>"
    primary_key = [('gid',1), ('uid',"101")]
    update_of_attribute_columns = {
        'PUT' : [('name','David'), ('address','Hongkong')],
        'DELETE' : [('address', None, 1488436949003)],
        'DELETE_ALL' : [('mobile'), ('age')],
        'INCREMENT' : [('counter', -1)]
    }
    row = Row(primary_key, update_of_attribute_columns)

    # 次の条件が満たされた場合にのみ更新が成功するように指定します。それ以外の場合、更新は失敗します。
    # (1) 指定された行が存在する。
    # (2) 指定された行の age 列の値が 20 である。
    condition = Condition(RowExistenceExpectation.EXPECT_EXIST, SingleColumnCondition("age", 20, ComparatorType.EQUAL)) # 行が存在する場合にのみ行を更新します。

    consumed, return_row = client.update_row(table_name, row, condition)