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

特點

主鍵列自增具有如下特點:

  • 自增列的值在分區鍵層級唯一且嚴格遞增,但不保證連續。
  • 自增列的資料類型為64位的有符號長整型。
  • 自增列是資料表層級的,同一個執行個體下可以有自增列或者非自增列的資料表。
说明 無論是否使用主鍵列自增功能,不影響條件更新的規則,條件更新的規則請參見條件更新

限制

主鍵列自增有如下限制:

  • 每張資料表最多隻能設定一個主鍵列為自增列,主鍵中的分區鍵不能設定為自增列。
  • 只能在建立資料表時指定自增列,對於已存在的資料表不能建立自增列。
  • 只有整型的主鍵列才能設定為自增列,系統自動產生的自增列值為64位的有符號長整型。
  • 屬性列不能設定為自增列。

介面

主鍵列自增的相關介面說明請參見下表。
介面說明
CreateTable建立資料表時,請設定非分區鍵的主鍵列為自增列,否則無法使用主鍵列自增功能。
UpdateTable資料表建立後,不能通過UpdateTable修改資料表的主鍵列為自增列。
PutRow寫入資料時,無需為自增列設定具體值,Tablestore會自動產生自增列的值。

通過設定ReturnType為RT_PK,可以擷取完整的主索引值,完整的主索引值可以用於GetRow查詢資料。

说明 如果要更新已存在的行,請先通過GetRange介面擷取要更新的行主鍵資訊,然後再進行資料更新。
UpdateRow
BatchWriteRow
GetRow使用GetRow時需要完整的主索引值,通過設定PutRow、UpdateRow或者BatchWriteRow中的ReturnType為RT_PK可以擷取完整的主索引值。
BatchGetRow

樣本

主鍵自增列功能主要涉及建立表(CreateTable)和寫資料(PutRow、UpdateRow和BatchWriteRow)兩類介面。

  1. 建立表

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

    private static void createTable(SyncClient client) {
        TableMeta tableMeta = new TableMeta(“table_name”);
        //第一列為分區鍵。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("PK_1", PrimaryKeyType.STRING));
        //第二列為自增列,類型為INTEGER,屬性為AUTO_INCREMENT。
        tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("PK_2", PrimaryKeyType.INTEGER, PrimaryKeyOption.AUTO_INCREMENT));
        int timeToLive = -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();
        //第一列的值為md5(receive_id)前4位。
        primaryKeyBuilder.addPrimaryKeyColumn(“PK_1”, PrimaryKeyValue.fromString("Hangzhou");
        //第二列是主鍵自增列,此處無需填入具體值,只需要一個預留位置AUTO_INCREMENT,Tablestore會自動產生此值。
        primaryKeyBuilder.addPrimaryKeyColumn("PK_2", 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)));
        //寫入資料到Tablestore。
        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());
    }

使用

您可以使用如下語言的SDK實現主鍵列自增功能。

計費

使用主鍵列自增功能不影響現有計費規則,返回的主鍵列資料不會額外消耗讀CU。