条件更新是指只有在满足条件时才对表中的数据进行更改,当不满足条件时更新失败。条件更新可用于put_row、update_row、delete_row和batch_write_row等操作。

参数说明

条件更新的判断条件包括行存在性条件和列条件。
  • 行存在性条件包含:
    • IGNORE:忽略
    • EXPECT_EXIST:期望存在
    • EXPECT_NOT_EXIST:期望不存在
    说明 在对表进行更改操作时,会首先检查行存在性条件。若不满足行存在性条件,则更改失败,出现报错。
  • 列条件基于某一列或者某些列的列值进行条件判断,与过滤器中的条件类似。列条件包含:
    • SingleColumnCondition:单列条件
    • CompositeColumnCondition:组合列条件

基于条件更新可以实现乐观锁的功能,即在更新某行时,先获取某列的值。假设为列 A,值为 1,然后设置条件“列 A=1”,更新该行同时使“列 A=2”。若更新失败,代表有其他客户端已经成功更新了该行。

示例

  • 示例1
    根据指定主键更新一行,如果指定的行存在,则更新成功,否则失败。
         updateRowRequest := new(tablestore.UpdateRowRequest)
        updateRowChange := new(tablestore.UpdateRowChange)
        updateRowChange.TableName = tableName
        updatePk := new(tablestore.PrimaryKey)
        updatePk.AddPrimaryKeyColumn("pk1", "pk1value1")
        updatePk.AddPrimaryKeyColumn("pk2", int64(2))
        updatePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
        updateRowChange.PrimaryKey = updatePk
        updateRowChange.DeleteColumn("col1")            // 删除列“col1”
        updateRowChange.PutColumn("col2", int64(77))    // 新增列“col2”,值为77
        updateRowChange.PutColumn("col4", "newcol3")    // 新增列“col4”,值为“newcol3”
        // 期望指定行存在
        updateRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
        updateRowRequest.UpdateRowChange = updateRowChange
        _, err := client.UpdateRow(updateRowRequest)
  • 示例2
    根据指定主键删除一行,如果指定的行存在,且列“col2”的值为3,则更新成功,否则失败。
        deleteRowReq := new(tablestore.DeleteRowRequest)
        deleteRowReq.DeleteRowChange = new(tablestore.DeleteRowChange)
        deleteRowReq.DeleteRowChange.TableName = tableName
        deletePk := new(tablestore.PrimaryKey)
        deletePk.AddPrimaryKeyColumn("pk1", "pk1value1")
        deletePk.AddPrimaryKeyColumn("pk2", int64(2))
        deletePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
        deleteRowReq.DeleteRowChange.PrimaryKey = deletePk
    
        // 期望行存在
        deleteRowReq.DeleteRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
        // 期望列“col2”的值为3
        clCondition1 := tablestore.NewSingleColumnCondition("col2", tablestore.CT_EQUAL, int64(3))
        deleteRowReq.DeleteRowChange.SetColumnCondition(clCondition1)
        _, err := client.DeleteRow(deleteRowReq)