条件更新

更新时间:
复制 MD 格式

Go SDK 可为行写入、更新或删除操作设置判断条件,仅在目标行满足条件时执行操作。

前提条件

安装Tablestore Go SDK并初始化客户端。

功能说明

条件更新包含行存在性条件和列条件,两者可以独立使用或组合使用。通过 PutRowChangeUpdateRowChangeDeleteRowChangeSetConditionSetColumnCondition 设置条件,也可以将这些行变更对象加入 BatchWriteRow 请求。条件不满足时,服务端返回错误且不修改数据。

  • 行存在性条件用于判断目标行是否存在,包括忽略判断、期望行存在和期望行不存在。

  • 列条件用于比较单列值,或通过逻辑运算组合多个列条件。不支持列与列或常量与常量比较。单次更新最多包含 10 个列条件。

以下示例仅在目标行存在且 score 列值为 30 时更新 status 列。

primaryKey := &tablestore.PrimaryKey{}
primaryKey.AddPrimaryKeyColumn("id", "row1")

change := &tablestore.UpdateRowChange{
    TableName:  "example_table",
    PrimaryKey: primaryKey,
}
change.PutColumn("status", "processed")
change.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
change.SetColumnCondition(
    tablestore.NewSingleColumnCondition("score", tablestore.CT_EQUAL, int64(30)),
)

_, err := client.UpdateRow(&tablestore.UpdateRowRequest{UpdateRowChange: change})
if err != nil {
    log.Fatal(err)
}

参数说明

行存在性条件

调用 SetCondition 设置 RowExistenceExpectation

名称

类型

说明

expectation(必选)

RowExistenceExpectation

行存在性条件。取值范围:RowExistenceExpectation_IGNORE,不判断目标行是否存在;RowExistenceExpectation_EXPECT_EXIST,仅当目标行存在时满足条件;RowExistenceExpectation_EXPECT_NOT_EXIST,仅当目标行不存在时满足条件。

单列条件

调用 NewSingleColumnCondition(columnName, comparator, value) 创建单列条件。SingleColumnCondition 包含以下参数。

名称

类型

说明

ColumnName(必选)

*string

要判断的列名称。

Comparator(必选)

*ComparatorType

关系运算符。支持 CT_EQUALCT_NOT_EQUALCT_GREATER_THANCT_GREATER_EQUALCT_LESS_THANCT_LESS_EQUAL

ColumnValue(必选)

interface{}

用于比较的常量值。

FilterIfMissing(可选)

bool

目标行不包含判断列时是否视为不满足条件。默认值为 false,即视为满足条件。

LatestVersionOnly(可选)

bool

是否只判断最新版本。默认值为 false,即任意版本满足条件即视为满足。

组合条件

调用 NewCompositeColumnCondition(lo) 创建组合条件,并调用 AddFilter 添加子条件。子条件可以是单列条件或嵌套的组合条件。CompositeColumnValueFilter 包含以下参数。

名称

类型

说明

Operator(必选)

LogicalOperator

逻辑运算符。LO_ANDLO_OR 至少需要两个子条件,LO_NOT 只能包含一个子条件。

Filters(必选)

[]ColumnFilter

参与逻辑运算的子条件。

场景示例

使用组合条件更新数据

以下示例仅在 score >= 60status 等于 pending 时执行更新。

condition := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
condition.AddFilter(
    tablestore.NewSingleColumnCondition("score", tablestore.CT_GREATER_EQUAL, int64(60)),
)
condition.AddFilter(
    tablestore.NewSingleColumnCondition("status", tablestore.CT_EQUAL, "pending"),
)

change.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
change.SetColumnCondition(condition)