日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

條件更新

只有當數據滿足列判斷條件時,才能對數據表中的數據進行更新;當數據不滿足列判斷條件時,數據更新失敗。

前提條件

  • 已初始化Client。具體操作,請參見初始化OTSClient

  • 已創建數據表并寫入數據。

使用方法

在通過PutRow、UpdateRow、DeleteRowBatchWriteRow接口更新數據時,可以使用條件更新檢查行存在性條件和列條件,只有滿足條件時才能成功更新。

條件更新包括行存在性條件和列條件。

  • 行存在性條件:包括IGNORE、EXPECT_EXISTEXPECT_NOT_EXIST,分別代表忽略、期望存在和期望不存在。

    對數據表進行更改操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗并給用戶報錯。

  • 列條件:包括SingleColumnConditionCompositeColumnCondition,是基于某一列或者某些列的列值進行條件判斷。

    列條件中支持使用關系運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR),單個更新條件中最多支持設置10個列條件。

    • SingleColumnCondition支持一列(可以是主鍵列)和一個常量比較。不支持兩列或者兩個常量相比較。

    • CompositeColumnCondition的內節點為邏輯運算,子條件可以是SingleColumnConditionCompositeColumnCondition。

條件更新可以實現樂觀鎖功能,即在更新某行時,先獲取某列的值,假設為列A,值為1,然后設置條件A=1,更新行使A=2。如果更新失敗,表示有其他客戶端已成功更新該行。

參數

參數

說明

RowExistenceExpectation

對數據表進行更改操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗并給用戶報錯。

行存在性條件包括IGNORE、EXPECT_EXISTEXPECT_NOT_EXIST,分別用RowExistenceExpectation_IGNORE、RowExistenceExpectation_EXPECT_EXIST、RowExistenceExpectation_EXPECT_NOT_EXIST表示。

  • IGNORE:表示忽略,不做任何存在性檢查。

  • EXPECT_EXIST:表示期望存在,如果該行存在,則滿足條件;如果該行不存在,則不滿足條件。

  • EXPECT_NOT_EXIST:期望行不存在,如果該行不存在,則滿足條件;如果該行存在,則不滿足條件。

ColumnName

列的名稱。

ColumnValue

列的對比值。

Comparator

對列值進行比較的關系運算符,類型詳情請參見ComparatorType

關系運算符包括EQUAL(=)、NOT_EQUAL(!=)、GREATER_THAN(>)、GREATER_EQUAL(>=)、LESS_THAN(<)和LESS_EQUAL(<=),分別用CT_EQUAL、CT_NOT_EQUAL、CT_GREATER_THAN、CT_GREATER_EQUAL、CT_LESS_THAN、CT_LESS_EQUAL表示。

Operator

對多個條件進行組合的邏輯運算符,類型詳情請參見LogicalOperator

邏輯運算符包括NOT、ANDOR,分別用LO_NOT、LO_AND、LO_OR表示。

邏輯運算符不同可以添加的子條件個數不同。

  • 當邏輯運算符為NOT時,只能添加一個子條件。

  • 當邏輯運算符為ANDOR時,必須至少添加兩個子條件。

FilterIfMissing

當列在某行中不存在時,條件檢查是否通過。類型為bool值,默認值為false,表示如果列在某行中不存在時,則條件檢查通過,該行滿足更新條件。

當設置FilterIfMissingtrue時,如果列在某行中不存在時,則條件檢查不通過,該行不滿足更新條件。

LatestVersionsOnly

當列存在多個版本的數據時,是否只使用最新版本的值做比較。類型為bool值,默認值為true,表示如果列存在多個版本的數據時,則只使用該列最新版本的值進行比較。

當設置LatestVersionsOnlyfalse時,如果列存在多個版本的數據,則會使用該列的所有版本的值進行比較,此時只要有一個版本的值滿足條件,就表示條件檢查通過,該行滿足更新條件。

示例

使用行存在性條件更新數據

以下示例用于根據指定主鍵更新一行數據,如果指定的行存在,則更新成功,否則更新失敗。

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))    //新增col2列,值為77。
updateRowChange.PutColumn("col4", "newcol3")    //新增col4列,值為"newcol3"。
//期望指定行存在。
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)) //新增col2列,值為77。
    //期望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")
    }