資料表主要用於資料的儲存與查詢。建立資料表後,您可以根據實際管理資料表,例如擷取執行個體中的所有表名稱、查詢資料表的配置資訊、更新資料表的配置資訊等。

说明 本文均以Java SDK為例介紹不同表操作的程式碼範例。

介面

表操作包括CreateTable、ListTable、UpdateTable、DescribeTable和DeleteTable介面,詳細說明請參見下表。

介面 說明
CreateTable 建立一張資料表或者建立一張帶有索引表的資料表。
ListTable 擷取當前執行個體下已建立的所有表的表名。
UpdateTable 更新資料表的配置資訊。
DescribeTable 查詢資料表的配置資訊。
DeleteTable 刪除一張資料表。

建立資料表(CreateTable)

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

使用SDK

參數

參數 說明
tableMeta 資料表的結構資訊,包括如下內容:
  • tableName:資料表名稱。
  • primaryKey:資料表的主鍵定義。更多資訊,請參見主鍵和屬性
    说明 屬性列不需要定義。Tablestore每行的資料列都可以不同,屬性列的列名在寫入時指定。
    • Tablestore可包含1個~4個主鍵列。主鍵列是有順序的,與使用者添加的順序相同。例如PRIMARY KEY(A, B, C)與PRIMARY KEY(A, C, B)是不同的兩個主鍵結構。Tablestore會按照整個主鍵的大小對行進行排序。
    • 第一列主鍵作為分區鍵。分區鍵相同的資料會存放在同一個分區內,所以相同分區鍵下最好不要超過10 GB以上資料,否則會導致單分區過大,無法分裂。另外,資料的讀/寫訪問最好在不同的分區鍵上均勻分布,有利於負載平衡。
  • definedColumns:預先定義一些非主鍵列以及其類型,可以作為索引表的屬性列或索引列。
tableOptions 資料表的配置資訊。更多資訊,請參見資料版本和生命週期

配置資訊包括如下內容:

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

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

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

    單位為秒。

    说明 如果需要使用索引,則資料生命週期必須設定為-1(資料永不到期)。
  • maxVersions:最大版本數,即屬性列能夠保留資料的最大版本個數。當屬性列資料的版本個數超過設定的最大版本數時,系統會自動刪除較早版本的資料。

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

    说明 如果需要使用索引,則最大版本數必須設定為1。
  • maxTimeDeviation:有效版本偏差,即寫入資料的時間戳記與系統目前時間的偏差允許最大值。只有當寫入資料所有列的版本號碼與寫入時時間的差值在資料有效版本偏差範圍內,資料才能成功寫入。

    屬性列的有效版本範圍為[資料寫入時間-有效版本偏差,資料寫入時間+有效版本偏差)

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

    單位為秒。

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

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

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

單位為CU。

  • 當預留讀輸送量或預留寫輸送量大於0時,Tablestore會根據配置為資料表預留相應資源,且資料表建立成功後,將會立即按照預留輸送量開始計費,超出預留的部分進行隨用隨付。更多資訊,請參見計費概述
  • 當預留讀輸送量或預留寫輸送量設定為0時,Tablestore不會為資料表預留相應資源。
indexMetas 索引表的結構資訊,每個indexMeta都包括如下內容:
  • indexName:索引表名稱。
  • primaryKey:索引表的索引列,索引列為資料表主鍵和預定義列的組合。

    使用本地二級索引時,索引表的第一個主鍵列必須與資料表的第一個主鍵列相同。

  • definedColumns:索引表的屬性列,索引表屬性列為資料表的預定義列的組合。
  • indexType:索引類型。可選值包括IT_GLOBAL_INDEX和IT_LOCAL_INDEX。
    • 當不設定indexType或者設定indexType為IT_GLOBAL_INDEX時,表示使用全域二級索引。

      使用全域索引時,Tablestore以非同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,正常情況下同步延遲達到毫秒層級。

    • 當設定indexType為IT_LOCAL_INDEX時,表示使用本地二級索引。

      使用本地二級索引時,Tablestore以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。

  • indexUpdateMode:索引更新模式。可選值包括IUM_ASYNC_INDEX和IUM_SYNC_INDEX。
    • 當不設定indexUpdateMode或者設定indexUpdateMode為IUM_ASYNC_INDEX時,表示非同步更新。

      使用全域二級索引時,索引更新模式必須設定為非同步更新(IUM_ASYNC_INDEX)。

    • 當設定indexUpdateMode為IUM_SYNC_INDEX時,表示同步更新。

      使用本地二級索引時,索引更新模式必須設定為同步更新(IUM_SYNC_INDEX)。

樣本

  • 建立資料表(不帶索引)
    private static void createTable(SyncClient client) {
            TableMeta tableMeta = new TableMeta(TABLE_NAME);
            tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME, PrimaryKeyType.STRING)); //為主表添加主鍵列。
            int timeToLive = -1; //資料的到期時間,單位為秒,-1表示永不到期。帶索引表的資料表資料生命週期必須設定為-1。
            int maxVersions = 3; //儲存的最大版本數,1表示每列上最多儲存一個版本即儲存最新的版本。帶索引表的資料表最大版本數必須設定為1。
            TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
            CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
            request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0))); //設定預留讀寫輸送量,容量型執行個體中的資料表只能設定為0,高效能執行個體中的資料表可以設定為非零值。
            client.createTable(request);
    }
  • 建立資料表(帶索引且索引類型為全域二級索引)
    private static void createTable(SyncClient client) {
        TableMeta tableMeta = new TableMeta(TABLE_NAME);
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_1, PrimaryKeyType.STRING)); //為資料表添加主鍵列。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_2, PrimaryKeyType.INTEGER)); //為資料表添加主鍵列。
        tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_1, DefinedColumnType.STRING)); //為資料表添加預定義列。
        tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_2, DefinedColumnType.INTEGER)); //為資料表添加預定義列。
    
        int timeToLive = -1; //資料的到期時間,單位為秒,-1表示永不到期。帶索引表的資料表資料生命週期必須設定為-1。
        int maxVersions = 1; //儲存的最大版本數,1表示每列上最多儲存一個版本即儲存最新的版本。帶索引表的資料表最大版本數必須設定為1。
    
        TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
    
        ArrayList<IndexMeta> indexMetas = new ArrayList<IndexMeta>();
        IndexMeta indexMeta = new IndexMeta(INDEX_NAME);
        indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1); //為索引表添加主鍵列。
        indexMeta.addDefinedColumn(DEFINED_COL_NAME_2); //為索引表添加屬性列。
        indexMetas.add(indexMeta);
    
        CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas); //建立資料表的同時建立索引表。
    
        client.createTable(request);
    }
  • 建立資料表(帶索引且索引類型為本地二級索引)
    private static void createTable(SyncClient client) {
        TableMeta tableMeta = new TableMeta(TABLE_NAME);
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_1, PrimaryKeyType.STRING)); //為資料表添加主鍵列。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_2, PrimaryKeyType.INTEGER)); //為資料表添加主鍵列。
        tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_1, DefinedColumnType.STRING)); //為資料表添加預定義列。
        tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_2, DefinedColumnType.INTEGER)); //為資料表添加預定義列。
    
        int timeToLive = -1; //資料的到期時間,單位為秒,-1表示永不到期。帶索引表的資料表資料生命週期必須設定為-1。
        int maxVersions = 1; //儲存的最大版本數,1表示每列上最多儲存一個版本即儲存最新的版本。帶索引表的資料表最大版本數必須設定為1。
    
        TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
    
        ArrayList<IndexMeta> indexMetas = new ArrayList<IndexMeta>();
        IndexMeta indexMeta = new IndexMeta(INDEX_NAME);
        indexMeta.setIndexType(IT_LOCAL_INDEX);     //設定索引類型為本地二級索引(IT_LOCAL_INDEX)。
        indexMeta.setIndexUpdateMode(IUM_SYNC_INDEX);  //設定索引更新模式為同步更新(IUM_SYNC_INDEX)。當索引類型為本地二級索引時,索引更新模式必須為同步更新。
    
        indexMeta.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1); //為索引表添加主鍵列。索引表的第一列主鍵必須與資料表的第一列主鍵相同。
        indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1); //為索引表添加主鍵列。
        indexMeta.addDefinedColumn(DEFINED_COL_NAME_2); //為索引表添加屬性列。
        indexMetas.add(indexMeta);
    
        CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas); //建立資料表的同時建立索引表。
    
        client.createTable(request);
    }

列出表名稱(ListTable)

使用ListTable介面擷取當前執行個體下已建立的所有表的表名。

使用SDK

樣本

擷取執行個體下所有表的表名。

private static void listTable(SyncClient client) {
    ListTableResponse response = client.listTable();
    System.out.println("表的列表如下:");
    for (String tableName : response.getTableNames()) {
        System.out.println(tableName);
    }
}

更新表資訊(UpdateTable)

使用UpdateTable介面修改配置資訊(TableOptions)、預留讀輸送量或者預留寫輸送量(ReservedThroughput)。

使用SDK

參數

  • TableOptions

    TableOptions 包含表的 TTL、MaxVersions 和 MaxTimeDeviation 。

    參數 定義 說明
    TTL TimeToLive,資料存活時間
    • 單位:秒。
    • 如果期望資料永不到期,TTL 可設定為 -1。
    • 資料是否到期是根據資料的時間戳記目前時間表的 TTL三者進行判斷的。目前時間 - 資料的時間戳記 > 表的 TTL時,資料會到期並被清理。
    • 在使用 TTL 功能時需要注意寫入時是否指定了時間戳記,以及指定的時間戳記是否合理。如需指定時間戳記,建議設定MaxTimeDeviation。
    MaxTimeDeviation 寫入資料的時間戳記與系統目前時間的偏差允許最大值
    • 預設情況下系統會為新寫入的資料產生一個時間戳記,資料自動到期功能需要根據這個時間戳記判斷資料是否到期。使用者也可以指定寫入資料的時間戳記。如果使用者寫入的時間戳記非常小,與目前時間偏差已經超過了表上設定的 TTL 時間,寫入的資料會立即到期。設定 MaxTimeDeviation 可以避免這種情況。
    • 單位:秒。
    MaxVersions 每個屬性列保留的最大版本數 如果寫入的版本數超過 MaxVersions,服務端只會保留 MaxVersions 中指定的最大的版本。
  • ReservedThroughtput

    表的預留讀/寫輸送量配置。

    • ReservedThroughput 的調整有時間間隔限制,目前調整間隔為 1 分鐘。
    • 設定 ReservedThroughtput 後,Tablestore按照您預留讀/寫輸送量進行計費。
    • 當 ReservedThroughtput 大於 0 時,Tablestore會按照預留量和期間進行計費,超出預留的部分進行隨用隨付。更多資訊參見計費,以免產生未期望的費用。
    • 預設值為 0,即完全隨用隨付。
    • 容量型執行個體的預留讀/寫輸送量只能設定為 0,不允許預留。

樣本

更新表的TTL和最大版本數。

private static void updateTable(SyncClient client) {
    int timeToLive = -1;
    int maxVersions = 5; // 將最大版本數更新為5。
    TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
    UpdateTableRequest request = new UpdateTableRequest(TABLE_NAME);
    request.setTableOptionsForUpdate(tableOptions);
    client.updateTable(request);
}

查詢表描述資訊(DescribeTable)

使用DescribeTable介面可以查詢指定表的結構、預留讀/寫輸送量詳情等資訊。

使用SDK

參數

參數 說明
tableName 表名。

樣本

private static void describeTable(SyncClient client) {
    DescribeTableRequest request = new DescribeTableRequest(TABLE_NAME);
    DescribeTableResponse response = client.describeTable(request);
    TableMeta tableMeta = response.getTableMeta();
    System.out.println("表的名稱:" + tableMeta.getTableName());
    System.out.println("表的主鍵:");
    for (PrimaryKeySchema primaryKeySchema : tableMeta.getPrimaryKeyList()) {
        System.out.println(primaryKeySchema);
    }
    TableOptions tableOptions = response.getTableOptions();
    System.out.println("表的TTL:" + tableOptions.getTimeToLive());
    System.out.println("表的MaxVersions:" + tableOptions.getMaxVersions());
    ReservedThroughputDetails reservedThroughputDetails = response.getReservedThroughputDetails();
    System.out.println("表的預留讀輸送量:"
            + reservedThroughputDetails.getCapacityUnit().getReadCapacityUnit());
    System.out.println("表的預留寫輸送量:"
            + reservedThroughputDetails.getCapacityUnit().getWriteCapacityUnit());
}

刪除資料表(DeleteTable)

使用DeleteTable介面刪除當前執行個體下指定資料表。

使用SDK

參數

參數 說明
tableName 資料表名稱。

樣本

private static void deleteTable(SyncClient client) {
    DeleteTableRequest request = new DeleteTableRequest(TABLE_NAME);
    client.deleteTable(request);
}

其他動作方式

您還可以使用控制台或者命令列工具進行表操作。