全部产品
Search
文档中心

表格存储:创建数据表

更新时间:May 13, 2025

本文介绍如何通过Java SDK创建表格存储的数据表。

注意事项

创建数据表后,请等待数据表加载完成后再进行数据操作,否则数据操作会失败,这个过程通常需要几秒钟。

前提条件

初始化 Tablestore Client

方法说明

public CreateTableResponse createTable(CreateTableRequest createTableRequest) throws TableStoreException, ClientException

CreateTableRequest参数说明

  • tableMeta(必选)TableMeta:表结构信息,包含以下参数。

    名称

    类型

    说明

    tableName(必选)

    String

    数据表名称。

    primaryKey(必选)

    List<PrimaryKeySchema>

    主键信息。

    • 可以设置1~4个主键列,默认按升序进行排序,第一个主键列将作为分区键。

    • 主键数据类型包含STRING、INTEGER和BINARY,非分区键中整型的主键列可以设置主键列自增

    definedColumns(可选)

    List<DefinedColumnSchema>

    预定义列信息。

    • 预定义列是预先定义的属性列,可以用于创建二级索引多元索引

    • 预定义列数据类型包含STRING、INTEGER、BINARY、DOUBLE和BOOLEAN。

  • tableOptions(必选)TableOptions:配置信息,包含以下参数。

    名称

    类型

    说明

    timeToLive(必选)

    OptionalValue<Integer>

    数据生命周期,单位为秒。

    • 设置为-1时表示数据永不过期,否则取值最低为86400(1天),超出生命周期的数据将会被自动清除。

    • 如果要使用多元索引或二级索引功能,必须将数据生命周期设置为-1,或者将 allowUpdate参数设置为false。

    maxVersions(必选)

    OptionalValue<Integer>

    最大版本数。

    • 如果要使用多元索引或二级索引,最大版本数必须设置为 1。

    maxTimeDeviation(可选)

    OptionalValue<Long>

    有效版本偏差,单位为秒,默认值为86400(1天)。

    • 写入数据的时间戳与系统当前时间的差值必须在有效版本偏差范围内,否则写入数据将会失败。

    • 属性列数据的有效版本范围为 [max(数据写入时间-有效版本偏差, 数据写入时间-数据生命周期), 数据写入时间+有效版本偏差)

    allowUpdate(可选)

    OptionalValue<Boolean>

    是否允许更新,默认值为true。

    • 设置为false时,无法通过 updateRow() 方法更新数据。

  • indexMeta(可选)List<IndexMeta>:二级索引列表,每个索引包含以下参数。

    名称

    类型

    说明

    indexName(必选)

    String

    索引名称。

    primaryKey(必选)

    List<String>

    索引的主键列。

    • 可以由数据表的主键列和预定义列组成。

    • 使用本地二级索引时,索引第一个主键列必须是数据表的第一个主键列。

    definedColumns(可选)

    List<String>

    索引的预定义列。

    • 可以由数据表的预定义列组成。

    indexType(可选)

    IndexType

    索引类型,取值范围:

    • IT_GLOBAL_INDEX(默认值):全局二级索引。

    • IT_LOCAL_INDEX:本地二级索引。

    indexUpdateMode(可选)

    IndexUpdateMode

    索引更新模式,取值范围:

    • IUM_ASYNC_INDEX(默认值):异步更新。全局二级索引的更新模式必须设置为异步更新。

    • IUM_SYNC_INDEX:同步更新。本地二级索引的更新模式必须设置为同步更新。

  • streamSpecification(可选)OptionalValue<StreamSpecification>:Stream配置信息,包含以下参数。

    名称

    类型

    说明

    enableStream(必选)

    boolean

    是否开启Stream,默认值为false。

    expirationTime(可选)

    OptionalValue<Integer>

    Stream过期时间,表示增量日志过期时长。单位为小时,最大值为168(7天)。

    • enableStream设置为true时,必须设置expirationTime。

  • enableLocalTxn(可选)OptionalValue<Boolean>:是否开启局部事务,默认值为false,表示不开启局部事务。

    • 仅 Java SDK 5.11.0 及以上版本支持此功能。

    • 局部事务功能和主键列自增无法同时使用,如果您配置了主键列自增,局部事务功能即使设置开启也不会生效。

    • 如果创建数据表时未开启局部事务功能,创建数据表后需要使用该功能,请提交工单进行申请

  • sseSpecification(可选)OptionalValue<SSESpecification>数据加密设置,包含以下参数。

    重要

    数据加密功能只支持在创建数据表时开启和配置,创建数据表后无法关闭加密功能。

    名称

    类型

    说明

    enable(必选)

    boolean

    是否开启数据加密功能,默认值为false。

    keyType(可选)

    OptionalValue<SSEKeyType>

    加密类型。SSEKeyType包含以下类型。

    • SSE_KMS_SERVICE:KMS加密。

    • SSE_BYOK:BYOK加密。

    keyId(可选)

    OptionalValue<String>

    用户主密钥ID。仅当keyType为SSE_BYOK时需设置此参数。

    roleArn(可选)

    OptionalValue<String>

    RAM角色ARN。仅当keyType为SSE_BYOK时需设置此参数。

  • reservedThroughput(可选)ReservedThroughput预留读写吞吐量,单位为CU,默认值为0,仅CU模式的高性能型实例可以设置且有效。

示例代码

以下示例代码创建了一张test_table表,该表包含1个 String类型的主键。

public static void createTableExample(SyncClient client) {
    // 构造数据表的结构信息
    TableMeta tableMeta = new TableMeta("test_table");
    // 创建数据表至少需要添加一个主键
    tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("id", PrimaryKeyType.STRING));

    // 构造数据表的配置信息
    TableOptions tableOptions = new TableOptions();
    // 创建数据表时必须指定最大版本数
    tableOptions.setMaxVersions(1);
    // 创建数据表时必须指定数据生命周期,-1表示数据永不过期
    tableOptions.setTimeToLive(-1);

    // 构造Request并发起请求
    CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
    client.createTable(request);
}

您也可以在创建数据表的同时参考示例代码进行以下设置。

  • 添加预定义列

    tableMeta.addDefinedColumn(new DefinedColumnSchema("name", DefinedColumnType.STRING));
  • 设置有效版本偏差

    tableOptions.setMaxTimeDeviation(86400);
  • 设置是否允许更新

    tableOptions.setAllowUpdate(false);
  • 添加二级索引

    // 构造二级索引列表
    ArrayList<IndexMeta> indexMetas = new ArrayList<IndexMeta>();
    // 构造二级索引
    IndexMeta indexMeta = new IndexMeta("test_table_idx");
    // 设置索引主键
    indexMeta.addPrimaryKeyColumn("id");
    indexMeta.addPrimaryKeyColumn("name");
    // 设置索引类型
    indexMeta.setIndexType(IndexType.IT_LOCAL_INDEX);
    // 设置索引更新模式
    indexMeta.setIndexUpdateMode(IndexUpdateMode.IUM_SYNC_INDEX);
    // 添加二级索引
    indexMetas.add(indexMeta);
    
    // 构造Request请求
    CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas);
  • 设置Stream信息

    StreamSpecification streamSpecification = new StreamSpecification(true, 168);
    request.setStreamSpecification(streamSpecification);
  • 设置是否开启局部事务

    request.setLocalTxnEnabled(true);
  • 设置预留读写吞吐量

    // 设置预留读吞吐量为10000,预留写吞吐量为5000
    ReservedThroughput reservedThroughput = new ReservedThroughput(10000, 5000);
    request.setReservedThroughput(reservedThroughput);
  • 设置数据加密方式

    • KMS密钥加密

      SSESpecification sseSpecification = new SSESpecification(true, SSEKeyType.SSE_KMS_SERVICE);
      request.setSseSpecification(sseSpecification);
    • BYOK加密

      说明

      运行代码前需要获取用户主密钥ID和RAM角色ARN,具体操作请参见BYOK加密

      String keyId = "key-hzz6*****************";
      String roleArn = "acs:ram::1705************:role/tabletorebyok";
      SSESpecification sseSpecification = new SSESpecification(true, SSEKeyType.SSE_BYOK, keyId, roleArn);
      request.setSseSpecification(sseSpecification);

相关文档