只有當資料滿足列判斷條件時,才能對資料表中的資料進行更新;當資料不滿足列判斷條件時,資料更新失敗。
關於使用過程中可能出現的錯誤資訊,請參見錯誤碼參考。
前提條件
已初始化Client。具體操作,請參見初始化OTSClient。
已建立資料表並寫入資料。
使用方法
在通過PutRow、UpdateRow、DeleteRow或BatchWriteRow介面更新資料時,可以使用條件更新檢查行存在性條件和列條件,只有滿足條件時才能成功更新。
條件更新包括行存在性條件和列條件。
行存在性條件:包括IGNORE、EXPECT_EXIST和EXPECT_NOT_EXIST,分別代表忽略、期望存在和期望不存在。
對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。
列條件:包括SingleColumnCondition和CompositeColumnCondition,是基於某一列或者某些列的列值進行條件判斷。
列條件中支援使用關係運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR),單個更新條件中最多支援設定10個列條件。
SingleColumnCondition支援一列(可以是主鍵列)和一個常量比較。不支援兩列或者兩個常量相比較。
CompositeColumnCondition的內節點為邏輯運算,子條件可以是SingleColumnCondition或CompositeColumnCondition。
條件更新可以實現樂觀鎖功能,即在更新某行時,先擷取某列的值,假設為列A,值為1,然後設定條件列A=1,更新行使列A=2。如果更新失敗,表示有其他用戶端已成功更新該行。
參數
參數 | 說明 |
RowExistenceExpectation | 對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。 行存在性條件包括IGNORE、EXPECT_EXIST和EXPECT_NOT_EXIST,分別用RowExistenceExpectation_IGNORE、RowExistenceExpectation_EXPECT_EXIST、RowExistenceExpectation_EXPECT_NOT_EXIST表示。
|
column_name | 列的名稱。 |
column_value | 列的對比值。 |
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表示。 |
combinator | 對多個條件進行組合的邏輯運算子。更多資訊,請參見LogicalOperator。 邏輯運算子包括NOT、AND和OR,分別用LO_NOT、LO_AND、LO_OR表示。 邏輯運算子不同可以添加的子條件個數不同。
|
pass_if_missing | 當列在某行中不存在時,條件檢查是否通過。類型為bool值。取值範圍如下:
|
latest_version_only | 當列存在多個版本的資料時,是否只使用最新版本的值做比較。類型為bool值。取值範圍如下:
|
樣本
以下樣本用於根據指定主鍵更新一行資料,只有當同時滿足行存在且“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)
# 指定Condition必須同時滿足如下2個條件,才能更新成功,否則更新失敗。
# (1)指定的行存在。
# (2)“age”列值為20。
condition = Condition(RowExistenceExpectation.EXPECT_EXIST, SingleColumnCondition("age", 20, ComparatorType.EQUAL)) # 只有當行存在時,更新該行。
consumed, return_row = client.update_row(table_name, row, condition)