天天看點

Tablestore入門手冊-條件更新功能說明限制條件支援的API費用計算功能與示例表格存儲使用手冊

功能說明

條件更新功能隻有在滿足條件時才對表中的資料進行更改,當不滿足條件時更新失敗。

比如有如下場景,初始化資料,當資料字段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

Tablestore入門手冊-條件更新功能說明限制條件支援的API費用計算功能與示例表格存儲使用手冊