全部產品
Search
文件中心

Tablestore:建立資料表

更新時間:Jul 19, 2024

使用CreateTable介面建立資料表時,需要指定資料表的結構資訊和配置資訊,高效能執行個體中的資料表還可以根據需要設定預留讀/寫輸送量。建立資料表時支援建立一個或者多個索引表。

注意事項

  • 建立資料表後需要幾秒鐘進行載入,在此期間對該資料表的讀寫資料操作均會失敗。請等待資料表載入完畢後再進行資料操作。

  • 建立資料表時必須指定資料表的主鍵。主鍵包含1個~4個主鍵列,每一個主鍵列都包括名稱和類型。

  • 如果在系統設計中存在為電商網站的商品ID、大型網站的使用者ID、論壇文章的ID、聊天工具的訊息ID等產生唯一標識的需求,您可以通過在建立資料表時配置主鍵列自增實現。具體操作,請參見主鍵列自增

前提條件

介面

/// <summary>
/// 根據表資訊(包含資料表名稱、主鍵的定義和預留讀寫輸送量)建立資料表。
/// </summary>
/// <param name="request">請求參數</param>
/// <returns>CreateTable的返回,此返回執行個體是空的,不包含具體資訊。
/// </returns>
public CreateTableResponse CreateTable(CreateTableRequest request);

/// <summary>
/// CreateTable的非同步形式。
/// </summary>
public Task<CreateTableResponse> CreateTableAsync(CreateTableRequest request);

參數

參數

說明

tableMeta

資料表的結構資訊,包括如下內容:

  • tableName:資料表名稱。

  • primaryKeySchema:資料表的主鍵定義,詳情請參見主鍵和屬性

    說明

    屬性列不需要定義。Table Store每行的資料列都可以不同,屬性列的列名在寫入時指定。

    • Table Store可包含1個~4個主鍵列。主鍵列是有順序的,與使用者添加的順序相同。例如PRIMARY KEY(A, B, C)與PRIMARY KEY(A, C, B)是不同的兩個主鍵結構。Table Store會按照整個主鍵的大小對行進行排序。

    • 第一列主鍵作為分區鍵。分區鍵相同的資料會存放在同一個分區內,所以相同分區鍵下的資料盡量不要超過10 GB,否則會導致單分區過大,無法分裂。另外,資料的讀/寫訪問盡量在不同的分區鍵上均勻分布,有利於負載平衡。

  • definedColumnSchema:預先定義一些非主鍵列以及其類型,可以作為索引表的屬性列或索引列。

tableOptions

資料表的配置資訊,詳情請參見資料版本和生命週期

配置資訊包括如下內容:

  • timeToLive:資料生命週期,即資料的到期時間。當資料的儲存時間超過設定的資料生命週期時,系統會自動清理超過資料生命週期的資料。

    資料生命週期至少為86400秒(一天)或-1(資料永不到期)。

    建立資料表時,如果希望資料永不到期,可以設定資料生命週期為-1;建立資料表後,可以通過UpdateTable介面動態修改資料生命週期。

    單位為秒。

    說明

    如果需要使用索引,則資料生命週期必須滿足如下條件中的任意一個。

    • 資料表的資料生命週期為-1(資料永不到期)。

    • 資料表的資料生命週期不為-1時,資料表為禁止更新狀態。

  • maxVersions:最大版本數,即屬性列能夠保留資料的最大版本個數。當屬性列資料的版本個數超過設定的最大版本數時,系統會自動刪除較早版本的資料。

    建立資料表時,可以自訂屬性列的最大版本數;建立資料表後,可以通過UpdateTable介面動態修改資料表的最大版本數。

    說明

    如果需要使用索引,則最大版本數必須設定為1。

  • deviationCellVersionInSec:有效版本偏差,即寫入資料的時間戳記與系統目前時間的偏差允許最大值。只有當寫入資料所有列的版本號碼與寫入時時間的差值在資料有效版本偏差範圍內,資料才能成功寫入。

    屬性列的有效版本範圍為[max{資料寫入時間-有效版本偏差,資料寫入時間-資料生命週期},資料寫入時間+有效版本偏差)

    建立資料表時,如果未設定有效版本偏差,系統會使用預設值86400;建立資料表後,可以通過UpdateTable介面動態修改有效版本偏差。

    單位為秒。

  • allowUpdate:是否允許UpdateRow相關更新寫入操作。預設值為true,表示允許UpdateRow相關更新寫入操作;當設定allowUpdate為false時,表示禁止UpdateRow相關更新寫入操作。

reservedThroughput

為資料表配置預留讀輸送量或預留寫輸送量。

容量型執行個體中的資料表的預留讀/寫輸送量只能設定為0,不允許預留。

預設值為0,即完全隨用隨付。

單位為CU。

  • 當預留讀輸送量或預留寫輸送量大於0時,Table Store會根據配置為資料表預留相應資源,且資料表建立成功後,將會立即按照預留輸送量開始計費,超出預留的部分進行隨用隨付。詳情請參見計費概述

  • 當預留讀輸送量或預留寫輸送量設定為0時,Table Store不會為資料表預留相應資源。

indexMetas

索引表的結構資訊,每個indexMeta都包括如下內容:

  • indexName:索引表名稱。

  • primaryKey:索引表的索引列,索引列為資料表主鍵和預定義列的任意組合。

  • definedColumns:索引表的屬性列,索引表屬性列為資料表的預定義列的組合。

  • indexUpdateMode:索引表更新模式,當前只支援IUM_ASYNC_INDEX。

  • indexType:索引表類型,當前只支援IT_GLOBAL_INDEX。

樣本

建立資料表時不帶索引

以下樣本建立一個有2個主鍵列,預留讀/寫輸送量為(0, 0)的資料表。

 //建立主鍵列的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);
 }
            

建立資料表時配置全域二級索引

以下樣本用於同時建立資料表和全域二級索引。該表包含Pk1(String類型)和Pk2(String類型)兩列主鍵且包含Col1(String類型)和Col2(String類型)兩個預定義列。該全域二級索引的主鍵列為Col1、Pk1和Pk2,屬性列為Col2。

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);
}

相關文檔

  • 關於API說明的更多資訊,請參見CreateTable

  • 如果要讀寫表中的資料,您可以通過調用讀寫資料介面實現。具體操作,請參見基礎資料操作

  • 如果要修改表的資料生命週期、最大版本數等資訊,您可以通過更新表實現。具體操作,請參見更新表

  • 如果要查看執行個體中已存在的所有表,您可以通過列出表名稱來實現。具體操作,請參見列出表名稱

  • 如果要查看錶的最大版本數、資料生命週期等配置資訊,您可以通過查看錶描述資訊實現。具體操作,請參見查詢表描述資訊

  • 如果不再使用資料表,您可以刪除資料表。具體操作,請參見刪除資料表