すべてのプロダクト
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: 行が存在しないことが想定されます。行が存在しない場合、条件は満たされます。それ以外の場合、条件は満たされません。

ColumnName

列の名前。

ColumnValue

列の比較値。

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(<=) を示します。

Operator

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

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

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

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

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

FilterIfMissing

行に列が存在しない場合に条件チェックを渡すかどうかを指定します。このパラメーターの値はブール型です。デフォルト値は false で、行に列が存在しない場合、条件チェックが渡され、行は更新条件を満たすことを指定します。

FilterIfMissing パラメーターを true に設定し、行に列が存在しない場合、条件チェックは失敗し、行は更新条件を満たしません。

LatestVersionsOnly

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

LatestVersionsOnly パラメーターを false に設定し、列に複数のバージョンの値がある場合、すべてのバージョンの値が比較に使用されます。この場合、1 つのバージョンのみが条件を満たす場合、条件チェックは渡され、行は更新条件を満たします。

行の有無の条件を使用してデータを更新する

次のサンプルコードは、主キーに基づいて行を更新する方法の例を示しています。指定された行が存在する場合、更新は成功します。それ以外の場合、更新は失敗します。

updateRowRequest := new(tablestore.UpdateRowRequest)
updateRowChange := new(tablestore.UpdateRowChange)
updateRowChange.TableName = tableName
updatePk := new(tablestore.PrimaryKey)
updatePk.AddPrimaryKeyColumn("pk1", "pk1value1")
updatePk.AddPrimaryKeyColumn("pk2", int64(2))
updatePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
updateRowChange.PrimaryKey = updatePk
updateRowChange.DeleteColumn("col1")            // col1 列を削除します。
updateRowChange.PutColumn("col2", int64(77))    // 値が 77 の col2 列を追加します。
updateRowChange.PutColumn("col4", "newcol3")    // 値が "newcol3" の col4 列を追加します。
// 行が存在することが想定されていることを指定します。
updateRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
updateRowRequest.UpdateRowChange = updateRowChange
_, err := client.UpdateRow(updateRowRequest)
if err != nil {
    fmt.Println("update failed with error:", err)
} else {
    fmt.Println("update row finished")
}

行の有無の条件と列ベースの条件を使用してデータを更新する

  • 条件を使用して行を更新する

    updateRowRequest := new(tablestore.UpdateRowRequest)
    updateRowChange := new(tablestore.UpdateRowChange)
    updateRowChange.TableName = tableName
    updatePk := new(tablestore.PrimaryKey)
    updatePk.AddPrimaryKeyColumn("pk1", "pk1value1")
    updateRowChange.PrimaryKey = updatePk
    updateRowChange.PutColumn("col2", int64(77)) // 値が 77 の col2 列を追加します。
    // col5 列の想定値が 3 であることを指定します。
    clCondition1 := tablestore.NewSingleColumnCondition("col5", tablestore.CT_EQUAL, int64(3))
    // FilterIfMissing パラメーターのデフォルト値は false で、行に列が存在しない場合、条件チェックが渡されることを指定します。
    // 行に列が存在しない場合に条件チェックが失敗することを指定するには、FilterIfMissing パラメーターを true に設定します。
    //clCondition1.FilterIfMissing = true
    // 行が存在することが想定されていることを指定します。
    updateRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
    updateRowChange.SetColumnCondition(clCondition1)
    updateRowRequest.UpdateRowChange = updateRowChange
    _, err := client.UpdateRow(updateRowRequest)
    if err != nil {
        fmt.Println("update failed with error:", err)
    } else {
        fmt.Println("update row finished")
    }

  • 条件を使用して行を削除する

    次のサンプルコードは、主キーに基づいて行を削除する方法の例を示しています。指定された行が存在し、col2 列の値が 3 の場合、更新は成功します。それ以外の場合、更新は失敗します。

    deleteRowReq := new(tablestore.DeleteRowRequest)
    deleteRowReq.DeleteRowChange = new(tablestore.DeleteRowChange)
    deleteRowReq.DeleteRowChange.TableName = tableName
    deletePk := new(tablestore.PrimaryKey)
    deletePk.AddPrimaryKeyColumn("pk1", "pk1value1")
    deletePk.AddPrimaryKeyColumn("pk2", int64(2))
    deletePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
    deleteRowReq.DeleteRowChange.PrimaryKey = deletePk
    
    // 行が存在することが想定されていることを指定します。
    deleteRowReq.DeleteRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
    // col2 列の想定値が 3 であることを指定します。
    clCondition1 := tablestore.NewSingleColumnCondition("col2", tablestore.CT_EQUAL, int64(3))
    // FilterIfMissing パラメーターのデフォルト値は false で、行に列が存在しない場合、条件チェックが渡されることを指定します。
    // 行に列が存在しない場合に条件チェックが失敗することを指定するには、FilterIfMissing パラメーターを true に設定します。
    //clCondition1.FilterIfMissing = true
    deleteRowReq.DeleteRowChange.SetColumnCondition(clCondition1)
    _, err := client.DeleteRow(deleteRowReq)
    if err != nil {
        fmt.Println("delete failed with error:", err)
    } else {
        fmt.Println("delete row finished")
    }