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

條件更新

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

前提條件

  • 已初始化OTSClient。具體操作,請參見初始化客戶端

  • 已創(chuàng)建數(shù)據(jù)表并寫入數(shù)據(jù)。

使用方法

在通過PutRowUpdateRowDeleteRowBatchWriteRow接口操作表中數(shù)據(jù)時,您可以使用條件更新檢查行存在性條件和列條件。只有當數(shù)據(jù)滿足列判斷條件時,才能對數(shù)據(jù)表中的數(shù)據(jù)進行更新。

條件更新中的列判斷條件包括列條件和行存在性條件。

  • 列條件

    目前支持SingleColumnValueConditionCompositeColumnValueCondition,是基于某一列或者某些列的列值進行條件判斷,與過濾器Filter中的條件類似。

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

    • SingleColumnValueCondition支持一列和一個常量比較。不支持兩列或者兩個常量相比較。

    • CompositeColumnValueCondition的內(nèi)節(jié)點為邏輯運算,子條件可以是SingleColumnValueConditionCompositeColumnValueCondition。

  • 行存在性條件

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

    行存在性條件包括IGNORE(忽略)、EXPECT_EXIST(期望存在)和EXPECT_NOT_EXIST(期望不存在)三種類型。

參數(shù)

參數(shù)

說明

RowExistenceExpectation

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

行存在性條件包括IGNORE、EXPECT_EXISTEXPECT_NOT_EXIST。

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

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

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

ColumnName

列的名稱。

ColumnValue

列的對比值。

CompareOperator

對列值進行比較的關(guān)系運算符。關(guān)于類型的更多信息,請參見ComparatorType

關(guān)系運算符包括EQUAL(=)、NOT_EQUAL(!=)、GREATER_THAN(>)、GREATER_EQUAL(>=)、LESS_THAN(<)和LESS_EQUAL(<=)。

LogicOperator

對多個條件進行組合的邏輯運算符。關(guān)于類型的更多信息,請參見LogicalOperator

邏輯運算符包括NOT、ANDOR。邏輯運算符不同可以添加的子條件個數(shù)不同。

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

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

PassIfMissing

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

當設(shè)置PassIfMissingfalse時,如果列在某行中不存在,則條件檢查不通過,即該行不滿足更新條件。

LatestVersionsOnly

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

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

示例

請根據(jù)實際選擇使用列判斷條件更新數(shù)據(jù)以及使用樂觀鎖更新數(shù)據(jù)。

使用列判斷條件更新數(shù)據(jù)

  • 構(gòu)造SingleColumnValueCondition。

    以下示例用于當數(shù)據(jù)滿足Col0==0條件時,更新Col0列值。

    private static void updateRowWithSingleColumnValueCondition(SyncClient client, String pkValue){
        //構(gòu)造主鍵。
        PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
        PrimaryKey primaryKey = primaryKeyBuilder.build();
        
        //讀取一行數(shù)據(jù)。
        SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
        criteria.setMaxVersions(1);
        GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
        Row row = getRowResponse.getRow();
        long col0Value = row.getLatestColumn("Col0").getValue().asLong();
    
        //設(shè)置數(shù)據(jù)表名稱。
        RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
    
        //設(shè)置條件為Col0==0。
        SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition("Col0",
                SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(0));
        //如果不存在Col0列,條件檢查不通過。
        singleColumnValueCondition.setPassIfMissing(false);
        //只判斷最新版本。
        singleColumnValueCondition.setLatestVersionsOnly(true);
        Condition condition = new Condition();
        condition.setColumnCondition(singleColumnValueCondition);
        rowUpdateChange.setCondition(condition);
        //當數(shù)據(jù)滿足列判斷條件時,更新Col0列值,使Col0列值增加1。
        rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value+1)));
        try {
            client.updateRow(new UpdateRowRequest(rowUpdateChange));
            System.out.println("數(shù)據(jù)更新成功!");
        } catch (TableStoreException ex) {
            System.out.println("數(shù)據(jù)更新失敗!" + ex.toString());
        }
    }                 
  • 構(gòu)造CompositeColumnValueCondition。

    以下示例用于當數(shù)據(jù)滿足Col0 == 0Col1 > 100或者Col2 <= 10中任意一個條件時,更新Col0列值。

    private static void updateRowWithCompositeColumnValueCondition(SyncClient client, String pkValue){
        //構(gòu)造主鍵。
        PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
        PrimaryKey primaryKey = primaryKeyBuilder.build();
            
    		//讀取一行數(shù)據(jù)。
        SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
        criteria.setMaxVersions(1);
        GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
        Row row = getRowResponse.getRow();
        long col0Value = row.getLatestColumn("Col0").getValue().asLong();
    
        //設(shè)置數(shù)據(jù)表名稱。
        RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
    
        //composite1的條件為(Col0 == 0) AND (Col1 > 100)。
        CompositeColumnValueCondition composite1 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.AND);
        SingleColumnValueCondition single1 = new SingleColumnValueCondition("Col0",
                SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(0));
        SingleColumnValueCondition single2 = new SingleColumnValueCondition("Col1",
                SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
        composite1.addCondition(single1);
        composite1.addCondition(single2);
    
        //composite2的條件為((Col0 == 0) AND (Col1 > 100)) OR (Col2 <= 10)。
        CompositeColumnValueCondition composite2 = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR);
        SingleColumnValueCondition single3 = new SingleColumnValueCondition("Col2",
                SingleColumnValueCondition.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
        composite2.addCondition(composite1);
        composite2.addCondition(single3);
    
        Condition condition = new Condition();
        condition.setColumnCondition(composite2);
        rowUpdateChange.setCondition(condition);
    		//當數(shù)據(jù)滿足列判斷條件時,更新Col0列值,使Col0列值增加1。
        rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value+1)));
        try {
            client.updateRow(new UpdateRowRequest(rowUpdateChange));
            System.out.println("數(shù)據(jù)更新成功!");
        } catch (TableStoreException ex) {
            System.out.println("數(shù)據(jù)更新失敗!" + ex.toString());
        }
    }

使用樂觀鎖更新數(shù)據(jù)

通過Condition實現(xiàn)樂觀鎖機制,遞增一列。

以下示例用于讀取表中一行的Col0列值后比較當前Col0列值與讀取到的Col0列值是否相等,如果當前Col0列值等于讀取到的Col0列值,則更新Col0列值。

 private static void updateRowWithCondition(SyncClient client, String pkValue) {
     //構(gòu)造主鍵。
     PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
     primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
     PrimaryKey primaryKey = primaryKeyBuilder.build();

     //讀取一行數(shù)據(jù)。
     SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
     criteria.setMaxVersions(1);
     GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
     Row row = getRowResponse.getRow();
     long col0Value = row.getLatestColumn("Col0").getValue().asLong();

     //條件更新Col0列,使列值加1。
     RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
     Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
     ColumnCondition columnCondition = new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.EQUAL, ColumnValue.fromLong(col0Value));
     condition.setColumnCondition(columnCondition);
     rowUpdateChange.setCondition(condition);
     rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value + 1)));

     try {
         client.updateRow(new UpdateRowRequest(rowUpdateChange));
     } catch (TableStoreException ex) {
         System.out.println(ex.toString());
     }
 }