只有滿足條件時,才能對資料表中的資料進行更新;當不滿足條件時,更新失敗。
前提條件
- 已初始化Client,詳情請參見初始化。
- 已建立資料表並寫入資料。
使用方法
在通過PutRow、UpdateRow、DeleteRow或BatchWriteRow介面更新資料時,可以使用條件更新檢查行存在性條件和列條件,只有滿足條件時才能更新成功。
條件更新包括行存在性條件和列條件。
- 行存在性條件:包括IGNORE、EXPECT_EXIST和EXPECT_NOT_EXIST,分別代表忽略、期望存在和期望不存在。
對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。
- 列條件:包括SingleColumnCondition和CompositeColumnCondition,是基於某一列或者某些列的列值進行條件判斷。
- SingleColumnCondition支援一列(可以是主鍵列)和一個常量比較。不支援兩列或者兩個常量相比較。
- CompositeColumnCondition的內節點為邏輯運算,子條件可以是SingleColumnCondition或CompositeColumnCondition。
條件更新可以實現樂觀鎖功能,即在更新某行時,先擷取某列的值,假設為列A,值為1,然後設定條件列A=1,更新行使列A=2。如果更新失敗,表示有其他用戶端已成功更新該行。
限制
條件更新的列條件支援關係運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR),最多支援10個條件的組合。
參數
參數 | 說明 |
---|---|
RowExistenceExpectation | 對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。
行存在性條件包括IGNORE、EXPECT_EXIST和EXPECT_NOT_EXIST,分別用RowExistenceExpectation_IGNORE、RowExistenceExpectation_EXPECT_EXIST、RowExistenceExpectation_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、AND和OR,分別用LO_NOT、LO_AND、LO_OR表示。 邏輯運算子不同可以添加的子條件個數不同。
|
FilterIfMissing | 當列在某行中不存在時,條件檢查是否通過。類型為bool值,預設值為true,表示如果列在某行中不存在時,則條件檢查通過,該行滿足更新條件。
當設定FilterIfMissing為false時,如果列在某行中不存在時,則條件檢查不通過,該行不滿足更新條件。 |
LatestVersionsOnly | 當列存在多個版本的資料時,是否只使用最新版本的值做比較。類型為bool值,預設值為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)) //新增col2列,值為77。 updateRowChange.PutColumn("col4", "newcol3") //新增col4列,值為"newcol3"。 //期望指定行存在。 updateRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST) updateRowRequest.UpdateRowChange = updateRowChange _, err := client.UpdateRow(updateRowRequest)
- 樣本2
根據指定主鍵刪除一行,如果指定的行存在,且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)) deleteRowReq.DeleteRowChange.SetColumnCondition(clCondition1) _, err := client.DeleteRow(deleteRowReq)