設置非分區鍵的主鍵列為自增列后,在寫入數據時,無需為自增列設置具體值,表格存儲會自動生成自增列的值。該值在分區鍵級別唯一且嚴格遞增。
特點
主鍵列自增具有如下特點:
自增列的值在分區鍵級別唯一且嚴格遞增,但不保證連續。
自增列的數據類型為64位的有符號長整型。
自增列是數據表級別的,同一個實例下可以有自增列或者非自增列的數據表。
無論是否使用主鍵列自增功能,不影響條件更新的規則,條件更新的規則請參見條件更新。
場景
主鍵列自增功能適用于為電商網站的商品ID、大型網站的用戶ID、論壇帖子的ID、聊天工具的消息ID等生成唯一標識。
應用案例請參見如何優化高并發IM系統架構。
注意事項
每張數據表最多只能設置一個主鍵列為自增列,主鍵中的分區鍵不能設置為自增列。
只能在創建數據表時指定自增列,對于已存在的數據表不能創建自增列。
只有整型的主鍵列才能設置為自增列,系統自動生成的自增列值為64位的有符號長整型。
屬性列不能設置為自增列。
主鍵自增列功能和局部事務功能不能同時使用。
寫入數據到帶有自增主鍵列的表時,請務必返回并記錄自增列的值,用于后續數據更新或者數據讀取。
接口
主鍵列自增的相關接口說明請參見下表。
接口 | 說明 |
創建數據表時,請設置非分區鍵的主鍵列為自增列,否則無法使用主鍵列自增功能。 | |
數據表創建后,不能通過UpdateTable修改數據表的主鍵列為自增列。 | |
寫入數據時,無需為自增列設置具體值,表格存儲會自動生成自增列的值。 通過設置ReturnType為RT_PK,可以獲取完整的主鍵值,完整的主鍵值可以用于GetRow查詢數據。 重要 要更新已存在的行數據時,如果未記錄自增主鍵列的值,請先通過GetRange接口獲取要更新的行主鍵信息,然后再進行數據更新。 | |
使用GetRow時需要完整的主鍵值,通過設置PutRow、UpdateRow或者BatchWriteRow中的ReturnType為RT_PK可以獲取完整的主鍵值。 重要 寫入數據時,如果未記錄自增主鍵列的值,您可以使用范圍讀取數據按照第一個主鍵列確定范圍讀取數據。更多信息,請參見范圍讀取數據。 | |
使用方式
使用控制臺
創建帶有自增主鍵列的數據表。
登錄表格存儲控制臺。
在概覽頁面,單擊實例操作列的實例管理。
在實例詳情頁簽的數據表列表區域,單擊創建數據表。
在創建數據表對話框,配置數據表名稱和表主鍵,其他參數請根據實際場景進行配置。
配置表主鍵時,您需要將其中一個非分區鍵的主鍵列類型選擇為自增列。
說明關于參數配置的更多信息,請參見通過控制臺創建數據表。
單擊確定。
寫入數據。
在實例詳情頁簽的數據表列表區域,單擊數據表名稱。
在數據管理頁簽,單擊插入數據。
在插入數據對話框,輸入主鍵值以及根據實際增加屬性列。
其中自增列的值無需填寫,系統會在寫入數據時自動生成自增列的值。通過多次單擊圖標并配置屬性列的名稱、類型、屬性值等信息,您可以增加多個屬性列。
單擊確定。
系統會顯示寫入成功的數據。請記錄行數據的完整主鍵信息用于后續更新或者讀取數據。
使用命令行工具
創建并使用帶有自增主鍵列的數據表。
執行
create
命令創建數據表。更多信息,請參見創建表。以下示例用于創建帶有自增主鍵列的mytable數據表。該數據表有uid(string類型)和pid(integer類型)兩個主鍵列并設置第二主鍵列pid(integer類型)為自增列,表中數據永不過期。
create -t mytable --pk '[{"c":"uid", "t":"string"}, {"c":"pid", "t":"integer", "opt":"auto"}]'
執行
use --wc -t mytable
命令使用數據表。
執行
put
命令寫入一行數據。更多信息,請參見插入新數據。以下示例用于在數據表中插入一行數據。該行的第一主鍵列值為“86”,第二主鍵列值為null,屬性列有name(string類型)和country(string類型)兩列。
put --pk '["86", null]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]'
使用SDK
您可以通過Java SDK、Go SDK、Python SDK、Node.js SDK、.NET SDK和PHP SDK使用主鍵自增列功能。此處以Java SDK為例介紹主鍵自增列的使用。
創建帶有自增主鍵列的數據表。
創建表時,只需將自增的主鍵屬性設置為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); }
寫入數據。
寫入數據時,無需為自增列設置具體值,只需將自增列的值設置為占位符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,表格存儲會自動生成此值。 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"))); //寫入數據到表格存儲。 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()); }
計費說明
使用主鍵列自增功能不影響現有計費規則,返回的主鍵列數據不會額外消耗讀CU。