說明 組成表的基本單位為行,行由主鍵和屬性群組成。其中主鍵是必須的,且每一行的主鍵列的名稱和類型相同;屬性不是必須的,且每一行的屬性可以不同。更多資訊,請參見寬表模型介紹。
插入單行資料
調用PutRow介面新寫入一行資料。系統會先刪除原行資料(原行的所有列以及所有版本的資料),再寫入新行資料。適用於要寫入資料較少的情境。
插入單行資料時,您可以根據需要進行如下配置。
不同的操作返回的結果不同。
更新單行資料
調用UpdateRow介面更新一行資料,可以增加和刪除一行中的屬性列,刪除屬性列指定版本的資料,或者更新已存在的屬性列的值。如果更新的行不存在,則新增一行資料。適用於更新已寫入資料的情境,例如刪除屬性列、刪除某個資料版本、修改屬性列值等。
說明 當UpdateRow請求中只包含刪除指定的列且該行不存在時,則該請求不會新增一行資料。
更新單行資料時,您可以根據需要進行如下配置。
一次請求中支援增加和刪除一行中的屬性列,刪除屬性列指定版本的資料,或者更新已存在的屬性列的值。
系統預設將目前時間的毫秒單位時間戳記(從1970-01-01 00:00:00
UTC計算起的毫秒數)作為資料的版本號碼。您可以自訂資料的版本號碼。更多資訊,請參見資料版本和生命週期。
使用條件更新中的行條件或者列條件。更多資訊,請參見條件更新。
批量寫入資料
調用BatchWriteRow介面在一次請求中進行批量寫入操作或者一次對多張表進行寫入。適用於要寫入、刪除或者更新大量資料以及要同時進行增刪改資料的情境。
BatchWriteRow操作由多個PutRow、UpdateRow、DeleteRow子操作組成,構造子操作的過程與使用PutRow介面、UpdateRow介面和DeleteRow介面時相同。
BatchWriteRow的各個子操作獨立執行,Tablestore會分別返回各個子操作的執行結果。
批量寫入資料時,您可以根據需要進行如下配置。
一次請求中支援對多張表進行插入、更新或者刪除資料操作。
由於批量寫入可能存在部分行失敗的情況,失敗行的Index及錯誤資訊在返回的BatchWriteRowResponse中,但並不拋出異常。因此調用BatchWriteRow介面時,需要檢查傳回值,可通過BatchWriteRowResponse的isAllSucceed方法判斷是否全部成功;如果不檢查傳回值,則可能會忽略掉部分操作的失敗。
當服務端檢查到某些操作出現參數錯誤時,BatchWriteRow介面可能會拋出參數錯誤的異常,此時該請求中所有的操作都未執行。
一次請求中支援分別對PutRow、UpdateRow、DeleteRow子操作設定更新條件。
系統預設將目前時間的毫秒單位時間戳記(從1970-01-01 00:00:00
UTC計算起的毫秒數)作為資料的版本號碼。您可以自訂資料的版本號碼。更多資訊,請參見資料版本和生命週期。
使用條件更新中的行條件或者列條件。更多資訊,請參見條件更新。
使用方式
使用控制台
您可以使用控制台插入單行資料或者更新單行資料。
登入Table Store控制台。
在概覽頁面,單擊執行個體操作列的執行個體管理。
在執行個體詳情頁簽的資料表列表地區,單擊資料表名稱。
在資料管理頁簽,根據實際插入資料或者更新資料。
插入單行資料
單擊插入資料。
在插入資料對話方塊,輸入主索引值。
單擊表徵圖,並配置屬性列名稱、屬性列類型、屬性值以及資料版本號碼。
當要增加多個屬性列時,請多次單擊表徵圖並配置相應屬性資訊。
單擊確定。
更新單行資料
選中要更新的行,單擊更新資料。
在更新資料對話方塊,根據需要修改屬性列資訊。
如果要增加屬性列,請單擊表徵圖,並配置屬性資訊;如果要刪除屬性列,請選擇操作為刪除全部;如果要刪除特定版本號碼的資料,請選擇操作為刪除,並選擇要刪除的資料版本號碼;如果要更新屬性列值,請選擇操作為更新,並修改屬性值。
單擊確定。
使用命令列工具CLI
您可以使用命令列工具執行如下命令寫入資料。
執行put
命令插入單行資料。更多資訊,請參見插入新資料。
以下樣本用於在資料表中插入一行資料。該行的第一主鍵列值為"86"
,第二主鍵列值為6771,屬性列有name(string類型)和country(string類型)兩列。
put --pk '["86", 6771]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]'
執行update
命令更新一行資料。更多資訊,請參見更新一行資料。
以下樣本用於更新第一主鍵列為"86"
,第二主鍵列為6771的行資料。無論此行是否存在均會插入新資料,如果之前行已存在,則寫入資料時會覆蓋原有資料。
update --pk '["86", 6771]' --attr '[{"c":"name", "v":"redchen"}, {"c":"country", "v":"china"}]' --condition ignore
使用SDK
您可以使用Java SDK、Go SDK、Python SDK、Node.js SDK、.NET SDK和PHP SDK寫入資料。此處以Java SDK為例介紹資料寫入的使用。
插入單行資料
插入資料時,您可以自訂資料版本號碼、使用列條件或者行條件。
插入資料時由系統自動產生資料版本號碼
以下樣本用於寫入10列屬性列,每列寫入1個版本,由系統自動產生資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) {
//構造主鍵。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//設定資料表名稱。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
//加入一些屬性列。
for (int i = 0; i < 10; i++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
client.putRow(new PutRowRequest(rowPutChange));
}
插入資料時自訂資料版本號碼
以下樣本用於寫入10列屬性列,每列寫入3個版本,自訂資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) {
//構造主鍵。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//設定資料表名稱。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
//加入一些屬性列。
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
插入資料時使用行條件
以下樣本用於當原行不存在時,寫入10列屬性列,每列寫入3個版本,自訂資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) {
//構造主鍵。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//設定資料表名稱。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
//設定條件更新,行條件檢查為期望原行不存在。
rowPutChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
//加入一些屬性列。
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
插入資料時使用列條件和行條件
以下樣本用於當原行存在且Col0列的值大於100時,寫入10列屬性列,每列寫入3個版本,自訂資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) {
//構造主鍵。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//設定資料表名稱。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
//設定條件更新,期望原行存在且Col0列的值大於100時寫入資料。
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
condition.setColumnCondition(new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
rowPutChange.setCondition(condition);
//加入一些屬性列。
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
更新單行資料
更新單行資料時,您可以自訂資料版本號碼、使用列條件或者行條件。
更新資料時不使用條件
以下樣本用於更新一些列,刪除某列的某一版本資料以及刪除某列。
private static void updateRow(SyncClient client, String pkValue) {
//構造主鍵。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//設定資料表名稱。
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
//更新一些列。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//刪除某列的某一版本。
rowUpdateChange.deleteColumn("Col10", 1465373223000L);
//刪除某一列。
rowUpdateChange.deleteColumns("Col11");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}
更新資料時使用列條件和行條件
以下樣本用於當原行存在且Col0列的值大於100時更新資料。
private static void updateRow(SyncClient client, String pkValue) {
//構造主鍵。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//設定資料表名稱。
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
//設定條件更新,期望原行存在且Col0列的值大於100時更新資料。
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
condition.setColumnCondition(new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
rowUpdateChange.setCondition(condition);
//更新一些列。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//刪除某列的某一版本。
rowUpdateChange.deleteColumn("Col10", 1465373223000L);
//刪除某一列。
rowUpdateChange.deleteColumns("Col11");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}
批量寫入資料
以下樣本中一次BatchWriteRow請求包含2個PutRow操作、1個DeleteRow操作和1個UpdateRow操作用於更新表中資料。
private static void batchWriteRow(SyncClient client) {
BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
//構造rowPutChange1。
PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk1Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk1"));
//設定資料表名稱。
RowPutChange rowPutChange1 = new RowPutChange("<TABLE_NAME>", pk1Builder.build());
//添加一些列。
for (int i = 0; i < 10; i++) {
rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowPutChange1);
//構造rowPutChange2。
PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk2Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk2"));
//設定資料表名稱。
RowPutChange rowPutChange2 = new RowPutChange("<TABLE_NAME>", pk2Builder.build());
//添加一些列。
for (int i = 0; i < 10; i++) {
rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowPutChange2);
//構造rowUpdateChange。
PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk3Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk3"));
//設定資料表名稱。
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", pk3Builder.build());
//添加一些列。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//刪除一列。
rowUpdateChange.deleteColumns("Col10");
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowUpdateChange);
//構造rowDeleteChange。
PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk4Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk4"));
//設定資料表名稱。
RowDeleteChange rowDeleteChange = new RowDeleteChange("<TABLE_NAME>", pk4Builder.build());
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowDeleteChange);
BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
System.out.println("是否全部成功:" + response.isAllSucceed());
if (!response.isAllSucceed()) {
for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
System.out.println("失敗的行:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
System.out.println("失敗原因:" + rowResult.getError());
}
/**
* 可以通過createRequestForRetry方法再構造一個請求對失敗的行進行重試。此處只給出構造重試請求的部分。
* 推薦的重試方法是使用SDK的自訂重試策略功能,支援對batch操作的部分行錯誤進行重試。設定重試策略後,調用介面處無需增加重試代碼。
*/
BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
}
}
計費說明
根據實際計算消耗折算成CU進行計費。同時根據執行個體類型不同,計費時需要區分按量讀寫CU以及預留讀寫CU。
操作 | CU消耗說明 |
PutRow操作 | |
UpdateRow操作 | 消耗的寫CU為修改的行主鍵資料大小與屬性列資料大小之和除以4 KB向上取整。 操作中包含的需要刪除的屬性列,只有屬性列的列名計入屬性列資料大小。 消耗的讀CU與指定的condition情況相關。通過在更新單行請求中設定condition欄位,可以指定更新操作執行時是否對行的存在性進行檢查。
|
BatchWriteRow操作 | 按照BatchWriteRow請求中包含的PutRow操作、UpdateRow操作和DeleteRow操作獨立計算讀寫CU。 其中DeleteRow操作消耗的讀CU和寫CU說明如下: 消耗的寫CU為刪除的行主鍵資料大小除以4 KB向上取整。 如果指定條件檢查不為IGNORE,則消耗行主鍵資料大小除以4 KB向上取整的讀CU。 如果操作不滿足指定的行存在性檢查條件,則操作失敗並消耗1單位寫CU。
|