条件更新是指只有在满足条件时才对表中的数据进行更改,当不满足条件时更新失败。条件更新可用于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)