只有當資料滿足列判斷條件時,才能對資料表中的資料進行更新;當資料不滿足列判斷條件時,資料更新失敗。
前提條件
已初始化OTSClient。具體操作,請參見初始化OTSClient。
已建立資料表並寫入資料。
使用方法
在通過PutRow、UpdateRow、DeleteRow和BatchWriteRow介面動作表中資料時,您可以使用條件更新檢查行存在性條件和列條件。只有當資料滿足列判斷條件時,才能對資料表中的資料進行更新。
條件更新中的列判斷條件包括列條件和行存在性條件。
列條件
目前支援SingleColumnValueCondition和CompositeColumnValueCondition,是基於某一列或者某些列的列值進行條件判斷,與過濾器Filter中的條件類似。
列條件中支援使用關係運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR),單個更新條件中最多支援設定10個列條件。
SingleColumnValueCondition支援一列和一個常量比較。不支援兩列或者兩個常量相比較。
CompositeColumnValueCondition的內節點為邏輯運算,子條件可以是SingleColumnValueCondition或CompositeColumnValueCondition。
行存在性條件
對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。
行存在性條件包括IGNORE(忽略)、EXPECT_EXIST(期望存在)和EXPECT_NOT_EXIST(期望不存在)三種類型。
參數
參數 | 說明 |
RowExistenceExpectation | 對資料表變更操作時,系統會先檢查行存在性條件,如果不滿足行存在性條件,則更改失敗並給使用者報錯。 行存在性條件包括IGNORE、EXPECT_EXIST和EXPECT_NOT_EXIST。
|
ColumnName | 列的名稱。 |
ColumnValue | 列的對比值。 |
CompareOperator | 對列值進行比較的關係運算子。關於類型的更多資訊,請參見ComparatorType。 關係運算子包括EQUAL(=)、NOT_EQUAL(!=)、GREATER_THAN(>)、GREATER_EQUAL(>=)、LESS_THAN(<)和LESS_EQUAL(<=)。 |
LogicOperator | 對多個條件進行組合的邏輯運算子。關於類型的更多資訊,請參見LogicalOperator。 邏輯運算子包括NOT、AND和OR。邏輯運算子不同可以添加的子條件個數不同。
|
PassIfMissing | 當列在某行中不存在時,條件檢查是否通過。類型為bool值,預設值為true,表示如果列在某行中不存在,則條件檢查通過,即該行滿足更新條件。 當設定PassIfMissing為false時,如果列在某行中不存在,則條件檢查不通過,即該行不滿足更新條件。 |
LatestVersionsOnly | 當列存在多個版本的資料時,是否只使用最新版本的值做比較。類型為bool值,預設值為true,表示如果列存在多個版本的資料,則只使用該列最新版本的值進行比較。 當設定LatestVersionsOnly為false時,如果列存在多個版本的資料,則會使用該列的所有版本的值進行比較,此時只要有一個版本的值滿足條件,就表示條件檢查通過,即該行滿足更新條件。 |
樣本
請根據實際選擇使用列判斷條件更新資料以及使用樂觀鎖更新資料。
使用列判斷條件更新資料
構造SingleColumnValueCondition。
以下樣本用於當資料滿足
Col0==0
條件時,更新Col0列值。private static void updateRowWithSingleColumnValueCondition(SyncClient client, String pkValue){ //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue)); PrimaryKey primaryKey = primaryKeyBuilder.build(); //讀取一行資料。 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(); //設定資料表名稱。 RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey); //設定條件為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); //當資料滿足列判斷條件時,更新Col0列值,使Col0列值增加1。 rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value+1))); try { client.updateRow(new UpdateRowRequest(rowUpdateChange)); System.out.println("資料更新成功!"); } catch (TableStoreException ex) { System.out.println("資料更新失敗!" + ex.toString()); } }
構造CompositeColumnValueCondition。
以下樣本用於當資料滿足
Col0 == 0且Col1 > 100
或者Col2 <= 10
中任意一個條件時,更新Col0列值。private static void updateRowWithCompositeColumnValueCondition(SyncClient client, String pkValue){ //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue)); PrimaryKey primaryKey = primaryKeyBuilder.build(); //讀取一行資料。 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(); //設定資料表名稱。 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); //當資料滿足列判斷條件時,更新Col0列值,使Col0列值增加1。 rowUpdateChange.put(new Column("Col0", ColumnValue.fromLong(col0Value+1))); try { client.updateRow(new UpdateRowRequest(rowUpdateChange)); System.out.println("資料更新成功!"); } catch (TableStoreException ex) { System.out.println("資料更新失敗!" + ex.toString()); } }
使用樂觀鎖更新資料
通過Condition實現樂觀鎖機制,遞增一列。
以下樣本用於讀取表中一行的Col0列值後比較當前Col0列值與讀取到的Col0列值是否相等,如果當前Col0列值等於讀取到的Col0列值,則更新Col0列值。
private static void updateRowWithCondition(SyncClient client, String pkValue) {
//構造主鍵。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//讀取一行資料。
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());
}
}