创建数据表

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

注意事项

  • 创建数据表后需要几秒钟进行加载,在此期间对该数据表的读写数据操作均会失败。请等待数据表加载完毕后再进行数据操作。

  • 如果您有主键数据自增的需求,例如电商网站的商品 ID、论坛帖子的 ID 等场景,可以在创建数据时配置主键列自增。具体操作,请参见主键列自增

前提条件

接口

/// <summary>
/// 根据指定表结构信息创建数据表。
/// </summary>
/// <param name="request">请求参数</param>
/// <returns>CreateTable的返回,此返回实例是空的,不包含具体信息。</returns>
public CreateTableResponse CreateTable(CreateTableRequest request);

/// <summary>
/// CreateTable的异步形式,其参数和调用方式与CreateTable保持一致。
/// </summary>
public Task<CreateTableResponse> CreateTableAsync(CreateTableRequest request);

参数说明

request包含以下参数:

参数

说明

tableMeta(必选

数据表的结构信息,包括如下内容:

  • tableName(必选):数据表名称。

  • primaryKeySchema(必选):数据表的主键定义。更多信息,请参见核心组件

    • 主键数据类型可以为 String、Integer 或 Binary。

    • 可以设置 1~4 个主键列。表格存储将按照设置的顺序生成主键,默认按升序进行排序。

    • 第一个主键列将作为分区键。

  • definedColumnSchema(可选):预定义列信息。数据类型可以为 STRING、INTEGER、BINARY、DOUBLE 或 BOOLEAN。

    说明
    • 预定义列是预先定义的一些非主键列,通常被用作二级索引的主键列或预定义列,以实现快速查询数据的需求。

    • 属性列在创建表时无需定义,您可以在写入数据时为每行数据指定不同的属性列和列名。

tableOptions(可选)

数据表的配置信息,包括如下内容:

  • timeToLive(可选):数据生命周期,即数据的过期时间,单位为秒。

    默认值为 -1(表示数据永不过期)。数据生命周期的取值最低为 86400 秒(一天),也可设置为 -1(永不过期)。

    重要

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

  • maxVersions(可选):最大版本数,即属性列能够保留数据的最大版本个数。

    默认值为 1,表示每列上最多保存一个版本,即保存最新的版本。

    重要

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

  • deviationCellVersionInSec(可选):有效版本偏差,即写入数据的时间戳与系统当前时间的偏差允许最大值,单位为秒。

    默认值 86400 秒(一天)。属性列的有效取值范围是一个左闭右开的区间:[max{数据写入时间-有效版本偏差,数据写入时间-数据生命周期},数据写入时间+有效版本偏差)

  • allowUpdate(可选):是否允许更新。默认为true。

    重要

    如果要使用多元索引的生命周期功能,必须设置此参数为 false。如果您需要更新数据,可使用 PutRow 接口写入数据。

indexMetas(可选)

索引列表。每个索引包含以下内容:

  • indexName(必选):索引名称。

  • primaryKey(必选):索引的主键列。可以由数据表的主键列和预定义列组成。

    重要

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

  • definedColumns(可选):索引的预定义列。可以由数据表的预定义列组成。

  • indexType(可选):索引类型,当前只支持全局二级索引。

  • indexUpdateModel(可选):索引更新模式,当前只支持异步更新。

说明

表格存储提供了全局和本地两种类型的二级索引,当前 .NET SDK 只支持全局二级索引。

reservedThroughput(必选

预留读写吞吐量,单位为 CU。默认值为 0。

重要

CU 模式下高性能型实例支持设置数据表的预留读写吞吐量为非零值。

streamSpecification(可选)

数据表的 Stream 配置信息,包括如下内容:

  • enableStream(可选):是否开启 stream。默认值为 false,即不开启 stream。

  • expirationTime(可选):stream 过期时间,表示增量日志过期时长。单位为小时,最大值为 168 小时(7 天)。

    说明

    开启 stream 时,必须设置 expirationTime 参数。

示例

创建数据表

以下示例用于创建数据表。

 //创建主键列的schema,包括PK的个数、名称和类型。
 //第一个PK列为整数,名称是pk0,这个同时也是分区键。
 //第二个PK列为字符串,名称是pk1。
 var primaryKeySchema = new PrimaryKeySchema();
 primaryKeySchema.Add("pk0", ColumnValueType.Integer);
 primaryKeySchema.Add("pk1", ColumnValueType.String);

 //通过表名和主键列的schema创建一个tableMeta。
 var tableMeta = new TableMeta("SampleTable", primaryKeySchema);

 //设置预留读吞吐量为0,预留写吞吐量为0。
 var reservedThroughput = new CapacityUnit(0, 0);

 try
 {
     //构造CreateTableRequest对象。
     var request = new CreateTableRequest(tableMeta, reservedThroughput);

     //调用client的CreateTable接口,如果没有抛出异常,则说明执行成功。
     otsClient.CreateTable(request);

     Console.WriteLine("Create table succeeded.");
 }
 //如果抛出异常,则说明失败,处理异常。
 catch (Exception ex)
 {
     Console.WriteLine("Create table failed, exception:{0}", ex.Message);
 }
            

创建数据表时配置全局二级索引

以下示例用于同时创建数据表和全局二级索引。

public static void CreateTableWithGlobalIndex()
{
    //创建数据表,两列主键为Pk1、Pk2,预定义列为Col1、Col2。
    //创建索引表,索引表中Col1放Pk0。
    OTSClient otsClient = Config.GetClient();

    Console.WriteLine("Start create table with globalIndex...");
    PrimaryKeySchema primaryKeySchema = new PrimaryKeySchema
        {
            { Pk1, ColumnValueType.String },
            { Pk2, ColumnValueType.String }
        };
    TableMeta tableMeta = new TableMeta(TableName, primaryKeySchema);
    tableMeta.DefinedColumnSchema = new DefinedColumnSchema {
            { Col1, DefinedColumnType.STRING},
            { Col2, DefinedColumnType.STRING}
        };

    IndexMeta indexMeta = new IndexMeta(IndexName);
    indexMeta.PrimaryKey = new List<string>() { Col1 };
    indexMeta.DefinedColumns = new List<string>() { Col2 };
    //indexMeta.IndexType = IndexType.IT_GLOBAL_INDEX;
    //indexMeta.IndexUpdateModel = IndexUpdateMode.IUM_ASYNC_INDEX;

    List<IndexMeta> indexMetas = new List<IndexMeta>() { };
    indexMetas.Add(indexMeta);

    CapacityUnit reservedThroughput = new CapacityUnit(0, 0);
    CreateTableRequest request = new CreateTableRequest(tableMeta, reservedThroughput, indexMetas);
    otsClient.CreateTable(request);

    Console.WriteLine("Table is created: " + TableName);
}

相关文档