全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
表格存储

主键列自增

更新时间:2017-06-07 13:26:11

主键列自增功能是表格存储新推出的一个功能,JAVA SDK 4.2.0 版本开始支持。

主键列自增功能是指若用户指定某一列主键为自增列,在其写入数据时,表格存储会自动为用户在这一列产生一个新的值,且这个值为同一个分区键下该列的最大值。主要用于系统设计中需要使用主键列自增功能的场景,例如电商网站的商品 ID、大型网站的用户 ID、论坛帖子的 ID、聊天工具的消息 ID 等。

特点

  • 表格存储目前支持多个主键,第一个主键为分区键,分区键上不允许使用主键列自增功能。

  • 除了分区键外,其余主键中的任意一个都可以被设置为递增列。

  • 由于是在分区键基础上递增,所以主键列自增是分区键级别的自增。

  • 对于每张表,目前只允许设置一个主键列为自增列。

  • 自动生成地自增列为 64 位的有符号长整型。

接口

主键自增列功能主要涉及两类接口,创建表和写数据。

创建表

创建表时,只需将需要自增的主键属性设置为 PrimaryKeyOption.AUTO_INCREMENT。

相关接口:CreateTable。

  1. private static void createTable(SyncClient client) {
  2. TableMeta tableMeta = new TableMeta(“table_name”);
  3. // 第一列为分区建
  4. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("PK_1", PrimaryKeyType.STRING));
  5. // 第二列为自增列,类型为INTEGER,属性为AUTO_INCREMENT
  6. tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("PK_2", PrimaryKeyType.INTEGER, PrimaryKeyOption.AUTO_INCREMENT));
  7. int timeToLive = -1; // 永不过期
  8. int maxVersions = 1; // 只保存一个版本
  9. TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
  10. CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
  11. client.createTable(request);
  12. }
  • 第一个主键是分区键,不能设置为自增列。

  • 只有整数类型的列才可以设置为自增列。

  • 每张表只能设置一个主键自增列。

写数据

写入数据时,只需将自增列的值为设置为占位符 PrimaryKeyValue.AUTO_INCREMENT。

相关接口:PutRow/UpdateRow/BatchWriteRow。

  1. private static void putRow(SyncClient client, String receive_id) {
  2. // 构造主键
  3. PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
  4. // 第一列的值为 md5(receive_id)前4位
  5. primaryKeyBuilder.addPrimaryKeyColumn(“PK_1”, PrimaryKeyValue.fromString("Hangzhou");
  6. // 第三列是主键递增列,这个值是TableStore产生的,用户在这里不需要填入真实值,只需要一个占位符:AUTO_INCREMENT 即可。
  7. primaryKeyBuilder.addPrimaryKeyColumn("PK_2", PrimaryKeyValue.AUTO_INCREMENT);
  8. PrimaryKey primaryKey = primaryKeyBuilder.build();
  9. RowPutChange rowPutChange = new RowPutChange("table_name", primaryKey);
  10. // 这里设置返回类型为RT_PK,意思是在返回结果中包含PK列的值。如果不设置ReturnType,默认不返回。
  11. rowPutChange.setReturnType(ReturnType.RT_PK);
  12. //加入属性列,消息内容
  13. rowPutChange.addColumn(new Column("content", ColumnValue.fromString(content)));
  14. //写数据到TableStore
  15. PutRowResponse response = client.putRow(new PutRowRequest(rowPutChange));
  16. // 打印出返回的PK列
  17. Row returnRow = response.getRow();
  18. if (returnRow != null) {
  19. System.out.println("PrimaryKey:" + returnRow.getPrimaryKey().toString());
  20. }
  21. // 打印出消耗的CU
  22. CapacityUnit cu = response.getConsumedCapacity().getCapacityUnit();
  23. System.out.println("Read CapacityUnit:" + cu.getReadCapacityUnit());
  24. System.out.println("Write CapacityUnit:" + cu.getWriteCapacityUnit());
  25. }
  • 写入数据时,主键自增列不需要填值,只需填充占位符即可。

  • 如果用户想获取向表格存储写入数据后自动生成的主键值,可以将 ReturnType 设置为 RT_PK,这样就能在写入成功后返回主键值。

本文导读目录