特点
主键列自增具有如下特点:
说明 无论是否使用主键列自增功能,不影响条件更新的规则,条件更新的规则请参见条件更新。
场景
主键列自增功能适用于为电商网站的商品ID、大型网站的用户ID、论坛帖子的ID、聊天工具的消息ID等生成唯一标识。
应用案例请参见如何优化高并发IM系统架构。
注意事项
每张数据表最多只能设置一个主键列为自增列,主键中的分区键不能设置为自增列。
只能在创建数据表时指定自增列,对于已存在的数据表不能创建自增列。
只有整型的主键列才能设置为自增列,系统自动生成的自增列值为64位的有符号长整型。
属性列不能设置为自增列。
主键自增列功能和局部事务功能不能同时使用。
写入数据到带有自增主键列的表时,请务必返回并记录自增列的值,以便用于后续数据更新或者数据读取。
接口
主键列自增的相关接口说明请参见下表。
接口 | 说明 |
CreateTable | 创建数据表时,请设置非分区键的主键列为自增列,否则无法使用主键列自增功能。 |
UpdateTable | 数据表创建后,不能通过UpdateTable修改数据表的主键列为自增列。 |
PutRow | 写入数据时,无需为自增列设置具体值,表格存储会自动生成自增列的值。 通过设置ReturnType为RT_PK,可以获取完整的主键值,完整的主键值可以用于GetRow查询数据。
重要 要更新已存在的行数据时,如果未记录自增主键列的值,请先通过GetRange接口获取要更新的行主键信息,然后再进行数据更新。 |
UpdateRow |
BatchWriteRow |
GetRow | 使用GetRow时需要完整的主键值,通过设置PutRow、UpdateRow或者BatchWriteRow中的ReturnType为RT_PK可以获取完整的主键值。
重要 写入数据时,如果未记录自增主键列的值,您可以使用范围读取数据按照第一个主键列确定范围读取数据。更多信息,请参见范围读取数据。 |
BatchGetRow |
使用方式
使用控制台
创建带有自增主键列的数据表。
登录表格存储控制台。
在概览页面,单击实例操作列的实例管理。
在实例详情页签的数据表列表区域,单击创建数据表。
在创建数据表对话框,配置数据表名称和表主键,其他参数请根据实际场景进行配置。
配置表主键时,您需要将其中一个非分区键的主键列类型选择为自增列。
单击创建。
写入数据。
在实例详情页签的数据表列表区域,单击数据表名称。
在数据管理页签,单击插入数据。
在插入数据对话框,输入主键值以及根据实际增加属性列。
其中自增列的值无需填写,系统会在写入数据时自动生成自增列的值。通过多次单击
图标并配置属性列的名称、类型、属性值等信息,您可以增加多个属性列。
单击确定。
系统会显示写入成功的数据。请记录行数据的完整主键信息用于后续更新或者读取数据。
使用命令行工具
创建并使用带有自增主键列的数据表。
执行create
命令创建数据表。更多信息,请参见创建表。
以下示例用于创建带有自增主键列的mytable数据表。该数据表有uid(string类型)和pid(integer类型)两个主键列并设置第二主键列pid(integer类型)为自增列,表中数据永不过期。
create -t mytable --pk '[{"c":"uid", "t":"string"}, {"c":"pid", "t":"integer", "opt":"auto"}]'
执行use --wc -t mytable
命令使用数据表。
执行put
命令写入一行数据。更多信息,请参见插入新数据。
说明 写入数据后,如果需要获取完整主键信息,您可以执行scan
命令获取指定行数据。更多信息,请参见扫描数据或者导出数据。
以下示例用于在数据表中插入一行数据。该行的第一主键列值为“86”,第二主键列值为null,属性列有name(string类型)和country(string类型)两列。
put --pk '["86", null]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]'
使用SDK
您可以通过Java SDK、Go SDK、Python SDK、Node.js SDK、.NET SDK和PHP SDK使用主键自增列功能。此处以Java SDK为例介绍主键自增列的使用。
以下示例代码在 test_table 表中写入一行数据,同时获取并打印写入行数据的主键信息。
public static void putRowTest(SyncClient client) {
// 构造主键
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
// 设置自增列为占位符
primaryKeyBuilder.addPrimaryKeyColumn("incr", PrimaryKeyValue.AUTO_INCREMENT);
PrimaryKey primaryKey = primaryKeyBuilder.build();
// 构造写入行数据
RowPutChange rowPutChange = new RowPutChange("test_table", primaryKey);
rowPutChange.addColumn("col1", ColumnValue.fromString("val1"));
// 设置返回类型为 RT_PK,返回写入行数据的主键信息
rowPutChange.setReturnType(ReturnType.RT_PK);
// 调用 putRow 方法写入行数据
PutRowRequest putRowRequest = new PutRowRequest();
putRowRequest.setRowChange(rowPutChange);
PutRowResponse putRowResponse = client.putRow(putRowRequest);
// RequestId 和 读写 CU 消耗
System.out.println("RequestId: " + putRowResponse.getRequestId());
System.out.println("Read CU Cost: " + putRowResponse.getConsumedCapacity().getCapacityUnit().getReadCapacityUnit());
System.out.println("Write CU Cost: " + putRowResponse.getConsumedCapacity().getCapacityUnit().getWriteCapacityUnit());
// 获取返回的主键信息并打印,如果不设置返回类型为 RT_PK,默认不返回主键信息
Row row = putRowResponse.getRow();
if(row != null)
System.out.println(row.getPrimaryKey().toString());
}
计费说明
使用主键列自增功能不影响现有计费规则,返回的主键列数据不会额外消耗读CU。