帮助文档 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
帮助文档 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 表格存储
  4. 开发参考
  5. SDK参考
  6. Go SDK
  7. 表操作
  8. 原子计数器

原子计数器

  • 表操作
  • 发布于 2025-04-22
  • 0 次阅读
文档编辑
文档编辑

如果要在某些在线应用中快速进行计数操作,您可以使用原子计数器实现。使用原子计数器时,您需要将表中的某一列当成一个原子计数器,然后对该列进行原子计数操作。

前提条件

  • 已初始化Client。具体操作,请参见初始化OTSClient。

  • 已创建数据表并写入数据。

注意事项

  • 只支持对整型列的列值进行原子计数操作。

  • 作为原子计数器的列,如果写入数据前该列不存在,则默认值为0;如果写入数据前该列已存在且列值非整型,则产生OTSParameterInvalid错误。

  • 增量值可以是正数或负数,但不能出现计算溢出。如果出现计算溢出,则产生OTSParameterInvalid错误。

  • 默认不返回进行原子计数操作的列值,您可以通过相应操作指定返回进行原子计数操作的列值。

  • 在单次更新请求中,不能对某一列同时进行更新和原子计数操作。假设列A已经执行原子计数操作,则列A不能再执行其他操作(例如列的覆盖写,列删除等)。

  • 在一次BatchWriteRow请求中,支持对同一行数据进行多次更新操作。但是如果某一行已进行原子计数操作,则该行在此批量请求中只能出现一次。

  • 原子计数操作只能作用在列值的最新版本,不支持对列值的特定版本做原子计数操作。更新完成后,原子计数操作会插入一个新的数据版本。

接口

updateRowChange类中新增了原子计数器的操作接口,操作接口说明请参见下表。

接口

说明

IncrementColumn(columnName string, value int64)

对列执行增量变更,例如+X,-X等。

AppendIncrementColumnToReturn(name string)

对于进行原子计数操作的列,设置需要返回列值的列名。

SetReturnIncrementValue()

设置返回类型,返回进行原子计数操作的列的新值。

参数

参数

是否必选

说明

TableName

是

数据表名称。

ColumnName

是

进行原子计数操作的列名。只支持对整型列的列值进行原子计数器操作。

Value

是

对列进行增量变更的值。

示例

以下示例用于在写入数据时使用updateRowChange接口对整型列做列值的增量变更,然后读取更新后的新值。

func UpdateRowWithIncrement(client *tablestore.TableStoreClient, tableName string) {
    fmt.Println("begin to update row")
    updateRowRequest := new(tablestore.UpdateRowRequest)
    updateRowChange := new(tablestore.UpdateRowChange)
    //设置数据表名称。
    updateRowChange.TableName = tableName
    updatePk := new(tablestore.PrimaryKey)
    updatePk.AddPrimaryKeyColumn("pk1", "pk1increment")
    updatePk.AddPrimaryKeyColumn("pk2", int64(2))
    updatePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
    updateRowChange.PrimaryKey = updatePk
    //将进行原子计数操作的col2列的列值+30,不能设置时间戳。
    updateRowChange.IncrementColumn("col2", int64(30))
    //将进行原子计数操作的列值返回。
    updateRowChange.SetReturnIncrementValue()
    updateRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
    updateRowChange.AppendIncrementColumnToReturn("col2")
    updateRowRequest.UpdateRowChange = updateRowChange

    resp, err := client.UpdateRow(updateRowRequest)
    if err != nil {
        fmt.Println("update failed with error:", err)
        return
    } else {
        fmt.Println("update row finished")
        fmt.Println(len(resp.Columns))
        fmt.Println(resp.Columns[0].ColumnName)
        fmt.Println(resp.Columns[0].Value)
        fmt.Println(resp.Columns[0].Timestamp)
    }
}
相关文章

创建数据表 2025-04-22 14:26

本文将通过参数说明和示例代码为您介绍如何使用 Go SDK 创建数据表。在创建数据表时,您需要指定数据表的结构信息和配置信息。CU 模式(原按量模式)下高性能型实例中的数据表还可以根据需要设置预留读写吞吐量。

创建加密表 2025-04-22 14:26

本文将通过参数说明和示例代码为您介绍如何使用 Go SDK 创建加密数据表,实现数据加密存储功能。表格存储提供两种加密方式:基于密钥管理服务(Key Management Service,简称 KMS)的密钥加密和基于自带密钥(Bring Your Own Key,简称 BYOK)的自定义密钥加密。

更新表配置 2025-04-22 14:26

本文将通过参数说明和示例代码为您介绍如何使用 Go SDK 更新表配置。在更新数据表时,您可以修改表的配置信息(例如数据生命周期、最大版本数、有效版本偏差等)和 Stream 配置。此外,您还可以为 CU 模式(原按量模式)下高性能型实例中数据表调整预留读写吞吐量。

列出表名称 2025-04-22 14:26

使用ListTable接口获取当前实例下已创建的所有表的表名。 前提条件

预定义列操作 2025-04-22 14:26

预定义列是为数据表预先定义一些非主键列以及其类型。为数据表设置预定义列后,在创建二级索引时,您可以将预定义列作为索引表的索引列或者属性列。如果不再使用某些预定义列,您可以删除相应预定义列。 注意事项 只有使用二级索引时才需要为数据表添加

查询表描述信息 2025-04-22 14:26

使用DescribeTable接口可以查询指定表的结构、预留读/写吞吐量详情等信息。 前提条件

目录
Copyright © 2025 your company All Rights Reserved. Powered by 博智数字服务平台.
闽ICP备08105208号-1