全部產品
Search
文件中心

Tablestore:條件更新

更新時間:Jul 09, 2024

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

前提條件

使用方法

在通過PutRow、UpdateRow、DeleteRow或BatchWriteRow介面更新資料時,可以使用條件更新檢查行存在性條件和列條件,只有滿足條件時才能成功更新。

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

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

    對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。

  • 列條件:包括SingleColumnCondition和CompositeCondition,是基於某一列或者某些列的列值進行條件判斷。

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

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

    • CompositeCondition的內節點為邏輯運算,子條件可以是SingleColumnCondition或CompositeCondition。

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

參數

參數

說明

RowExistenceExpectation

對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。

行存在性條件包括IGNORE、EXPECT_EXIST和EXPECT_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表示。

combinator

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

邏輯運算子包括NOT、AND和OR,分別用LO_NOT、LO_AND、LO_OR表示。

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

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

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

passIfMissing

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

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

latestVersionOnly

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

當設定latestVersionOnly為false時,如果列存在多個版本的資料時,則會使用該列的所有版本的值進行比較,此時只要有一個版本的值滿足條件,就條件檢查通過,該行滿足更新條件。

樣本

根據指定主鍵更新一行,只有同時滿足行存在,“name”列值為“john”和“addr”列值為“china”條件,才能更新成功;否則更新失敗。

   var params = {
    tableName: "sampleTable",
    primaryKey: [{ 'gid': Long.fromNumber(20013) }, { 'uid': Long.fromNumber(20013) }],
    updateOfAttributeColumns: [{ 'PUT': [{ 'col1': 'test6' }] }]
};

//指定條件。期望行存在並且name=john,addr=china。
var condition = new TableStore.CompositeCondition(TableStore.LogicalOperator.AND);
condition.addSubCondition(new TableStore.SingleColumnCondition('name', 'john', TableStore.ComparatorType.EQUAL));
condition.addSubCondition(new TableStore.SingleColumnCondition('addr', 'china', TableStore.ComparatorType.EQUAL));

params.condition = new TableStore.Condition(TableStore.RowExistenceExpectation.EXPECT_EXIST, condition);

client.updateRow(params,
    function (err, data) {
        if (err) {
            console.log('error:', err);
            return;
        }
        console.log('success:', data);
    });