功能說明
條件更新功能隻有在滿足條件時才對表中的資料進行更改,當不滿足條件時更新失敗。
比如有如下場景,初始化資料,當資料字段A為-1時,将A的值更新為指定的内容。比如更新為12;如果不是-1則更新失敗。
條件更新支援兩個次元。分别是行的存在性檢查和列值的條件判斷。
第一個次元是行的條件檢查,包括如下三種條件:
- IGNORE:忽略,不做存在性檢查;比如我們PutRow一行資料,PK為ABC,設定IGNORE之後,不管表中是否已經存在了ABC這一行資料,PutRow都可以寫入成功。寫入成功之後新寫入的行将覆寫老的行。
- EXPECT_EXIST:期望行存在;示例如上,同樣是寫入一行資料ABC,此次寫入是期望表中已經存在ABC這一行資料,如果存在,寫入成功,新的行覆寫老的行;如果不存在,此次寫入也将失敗。
- EXPECT_NOT_EXIST:期望行不存在;也是寫入一行資料ABC,此時希望表中不存在ABC這一行;如果表中存在這一行資料,寫入失敗;如果這行資料不存在,那麼寫入ABC。
第二個次元是列條件更新檢查,目前支援單條件(SingleColumnValueCondition)和多條件(CompositeColumnValueCondition) 列值判斷;列條件判斷還支援算術運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR)。
比如,我們要更新人員資訊,更新國家為中國的資料,僞代碼如下
SQL樣例: where 國家='中國'
# 僞代碼
SingleColumnValueCondition(國家=中國)
# 因為隻有一個條件,是以使用SingleColumnValueCondition
# 列名為“中國”,算數運算符為‘=’,隻為‘中國’
在限定必須小于20歲,變成了多條件檢查,
SQL樣例: where 國家='中國' and age<20
# 僞代碼如下
cond = CompositeColumnValueCondition(AND)
cond.addCondtition(SingleColumnValueCondition(國家=中國))
cond.addCondtition(SingleColumnValueCondition(age<20))
# 兩個條件,是以使用CompositeColumnValueCondition
# 同時兩個條件色‘且’的語義,使用AND
# 第一個條件同上,第二個使用了‘<’運算符
嵌套的方式,比如條件如下,比如中國為20歲一下,美國18歲一下
SQL樣例:where (國家='中國' and age<20) or (國家='美國' and age<18)
# 僞代碼如下
cond = CompositeColumnValueCondition(OR)
subCond1 = CompositeColumnValueCondition(AND)
subCond1.addCondtition(SingleColumnValueCondition(國家=中國))
subCond1.addCondtition(SingleColumnValueCondition(age<20))
subCond2 = CompositeColumnValueCondition(AND)
subCond2.addCondtition(SingleColumnValueCondition(國家=美國))
subCond2.addCondtition(SingleColumnValueCondition(age<18))
cond.addCondtition(subCond1)
cond.addCondtition(subCond2)
# 因為是嵌套條件,是以最外層使用CompositeColumnValueCondition,
# 由于隻要滿足一個條件即可,是以外圍的CompositeColumnValueCondition為‘或’的語義,是以使用OR
# 子條件可以參考之前的描述方式
# 最後将子條件添加到最外層的條件檢查中
限制條件
- 列條件最多 10 個條件的組合。
- 行和列的條件有效範圍,都隻能針對目前正在操作的這一行,不支援跨行條件檢查。
支援的API
- PutRow
- UpdateRow
- DeleteRow
- BatchWriteRow
費用計算
如果寫入資料或者更新資料删除資料,CU的計算規則和平時調用API的計費規則一緻。如果是條件檢查失敗,會分别消耗1機關的讀CU和1機關的寫CU。
功能與示例
背景:小明是公司HR,每月會對薪酬表(remuneration)進行定期的調整,薪酬表中記錄了相關人員的薪資資訊;我們定義了各種不同的更新方式,全方位的展示條件更新的使用方式。
部門(主鍵) | 人員數目 | 人員HC數目 | 獎金池 | 薪資池 |
技術部門 | 10 | 30 | 32 | 12034 |
财務部門 | 2 | |||
行政部門 | 3 | 5 | 12 | |
銷售部門 | 35 |
以下代碼使用Java代碼示範
場景一:新增一個部門“營運部門”,未來進行招聘,目前錄入部門薪酬資訊
# 由于是新增部門,我們期望表中不會存在該部門的資訊,是以使用 行存在性 的檢查,期望這一行
# 不存在(EXPECT_NOT_EXIST), 當原有表中不存在這行資料時,寫入成功,否則寫入失敗。
# PutRow的實作方式
{
RowPutChange rowChange = new RowPutChange(TABLE_NAME);
rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("營運部門"))
.build());
rowChange.addColumn("人員數目", ColumnValue.fromLong(0));
rowChange.addColumn("人員HC數目", ColumnValue.fromLong(30));
rowChange.addColumn("獎金池", ColumnValue.fromLong(30));
rowChange.addColumn("薪資池", ColumnValue.fromLong(35));
// 因為“營運部門”是新增,是以期望表中是不存在行的,是以采用行存在性檢查:EXPECT_NOT_EXIST
rowChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
}
場景二:更新行政部門的人員數目,從3更新為5人
# 這裡會使用兩個條件更新的檢查:
# 第一個是行存在性的檢查,期望這一行存在;
# 第二個是列的條件檢查,期望‘人員數目’是3,則更新,如果不是3則更新失敗
# UpdateRow的實作方式
{
RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME);
rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("行政部門"))
.build());
rowChange.put("人員數目", ColumnValue.fromLong(5));
// 行存在性檢查,期望存在
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
// 列條件檢查,期望 ‘人員數目’ 為 3
SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition(
"人員數目",
SingleColumnValueCondition.CompareOperator.EQUAL,
ColumnValue.fromLong(3)
);
condition.setColumnCondition(singleColumnValueCondition);
rowChange.setCondition(condition);
}
場景三:由于銷售部門已經外包給第三方公司,是以決定删除“銷售部門”的記錄資訊
# 這裡隻需要使用行存在性檢查即可,期望“銷售部門”的資訊存在(EXPECT_EXIST)
# DeleteRow的實作方式
{
RowDeleteChange rowChange = new RowDeleteChange(TABLE_NAME);
rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("銷售部門"))
.build());
// 行存在性檢查,期望存在
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
rowChange.setCondition(condition);
}
場景四:增加小團隊的HC,小團隊人員和HC小于等于5的,每個部門新增2個人頭的招聘資源, 比如财務部門就滿足這個條件,是以在更新财務部門的HC,更新的過程中使用條件更新檢查;
# UpdateRow的實作方式
{
RowUpdateChange rowChange = new RowUpdateChange(TABLE_NAME);
rowChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn(PK, PrimaryKeyValue.fromString("财務部門"))
.build());
rowChange.increment(new Column("人員HC數目", ColumnValue.fromLong(2)));
// 行存在性檢查
Condition condition = new Condition(RowExistenceExpectation.IGNORE);
CompositeColumnValueCondition conditions = new CompositeColumnValueCondition(CompositeColumnValueCondition.LogicOperator.OR);
{
// 列條件檢查,期望 ‘人員數目’ 小于等于5
SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition(
"人員數目",
SingleColumnValueCondition.CompareOperator.LESS_EQUAL,
ColumnValue.fromLong(5)
);
conditions.addCondition(singleColumnValueCondition);
}
{
// 列條件檢查,期望 ‘人員HC數目’ 小于等于5
SingleColumnValueCondition singleColumnValueCondition = new SingleColumnValueCondition(
"人員HC數目",
SingleColumnValueCondition.CompareOperator.LESS_EQUAL,
ColumnValue.fromLong(5)
);
conditions.addCondition(singleColumnValueCondition);
}
condition.setColumnCondition(conditions);
rowChange.setCondition(condition);
}
表格存儲使用手冊
本文結合Java SDK的接口調用代碼,介紹了Tablestore在資料管理方面的基本功能與使用方式。代碼已開源在Tablestore-Examples項目中,使用者可以直接運作使用。基于樣例代碼與文章,新使用者能更簡單、更快速地上手Tablestore,歡迎新、老使用者使用與建議。
通過對基礎使用功能的持續輸出,我們将整理出一套完整的使用手冊(含可執行樣例),敬請期待。
專家服務
如有疑問或者需要更好的線上支援,歡迎加入釘釘群:“表格存儲公開交流群”。群内提供免費的線上專家服務,歡迎掃碼加入,群号:23307953