全部產品
Search
文件中心

Tablestore:主鍵列自增

更新時間:Jun 30, 2024

設定非分區鍵的主鍵列為自增列後,在寫入資料時,無需為自增列設定具體值,Tablestore會自動產生自增列的值。該值在分區鍵層級唯一且嚴格遞增。

重要

Tablestore從Java SDK 4.2.0版本開始支援主鍵列自增功能。

注意事項

寫入資料到帶有自增主鍵列的表時,請務必返回並記錄自增列的值,用於後續資料更新或者資料讀取。

前提條件

已初始化Client。具體操作,請參見初始化OTSClient

使用方法

  1. 建立表時,將非分區鍵的主鍵列設定為自增列。

    只有整型的主鍵列才能設定為自增列,系統自動產生的自增列值為64位的有符號長整型。

  2. 寫入資料時,無需為自增列設定具體值,只需將自增列的值設定為預留位置。

    如果需要擷取寫入資料後系統自動產生的自增列的值,將ReturnType設定為RT_PK,可以在資料寫入成功後返回自增列的值。

    讀取資料時,需要完整的主索引值。通過設定PutRow、UpdateRow或者BatchWriteRow中的ReturnType為RT_PK可以擷取完整的主索引值。

    讀取資料時,如果已記錄完整主鍵,您可以使用讀取單行資料或者批量讀取資料方式讀取資料;如果未記錄自增主鍵列的值,您可以使用範圍讀取資料方式按照第一個主鍵列確定範圍讀取資料。

    說明

    要更新已存在的行資料時,如果未記錄自增主鍵列的值,請先通過GetRange介面擷取要更新的行主鍵資訊,然後再進行資料更新。

樣本

  1. 建立帶有自增主鍵列的資料表。

    建立表時,只需將自增的主鍵屬性設定為AUTO_INCREMENT。

    以下樣本用於建立資料表時配置主鍵自增列。該表的主鍵為pk1(String類型)和pk2(Integer類型),其中pk1主鍵列為分區鍵,pk2主鍵列為自增列。

    private static void createTable(SyncClient client) {
        //設定資料表名稱。
        TableMeta tableMeta = new TableMeta("<TABLE_NAME>");
        //為資料表添加主鍵列。第一列為分區鍵。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("pk1", PrimaryKeyType.STRING));
        //為資料表添加主鍵列。第二列為自增列,類型為INTEGER,屬性為AUTO_INCREMENT。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("pk2", PrimaryKeyType.INTEGER, PrimaryKeyOption.AUTO_INCREMENT));
        //資料的到期時間,單位為秒,-1表示資料永不到期。
        int timeToLive = -1;  
        //儲存的最大版本數,1表示每列上最多儲存一個版本即儲存最新的版本。
        int maxVersions = 1; 
        TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
        CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
        client.createTable(request);
    }
  2. 寫入資料。

    寫入資料時,無需為自增列設定具體值,只需將自增列的值設定為預留位置AUTO_INCREMENT。

    以下樣本用於向資料表中寫入一行資料,並返回完整主索引值和消耗的預留讀寫輸送量。

    private static void putRow(SyncClient client, String receive_id) {
        //構造主鍵。
        PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        //第一列的值為receive_id(String類型)參數的值。
        primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString(receive_id));
        //第二列是主鍵自增列,此處無需填入具體值,只需要一個預留位置AUTO_INCREMENT,Table Store會自動產生此值。
        primaryKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.AUTO_INCREMENT);
        PrimaryKey primaryKey = primaryKeyBuilder.build();
        //設定資料表名稱。
        RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
        //此處設定傳回型別為RT_PK,即在返回結果中包含PK列的值。如果不設定ReturnType,預設不返回。
        rowPutChange.setReturnType(ReturnType.RT_PK);
        //加入屬性列。
        rowPutChange.addColumn(new Column("content", ColumnValue.fromString("content")));
        //寫入資料到Table Store。
        PutRowResponse response = client.putRow(new PutRowRequest(rowPutChange));
        //列印返回的PK列。
        Row returnRow = response.getRow();
        if (returnRow != null) {
            System.out.println("PrimaryKey:" + returnRow.getPrimaryKey().toString());
        }
        //列印消耗的CU。
        CapacityUnit  cu = response.getConsumedCapacity().getCapacityUnit();
        System.out.println("Read CapacityUnit:" + cu.getReadCapacityUnit());
        System.out.println("Write CapacityUnit:" + cu.getWriteCapacityUnit());
    }