全部產品
Search
文件中心

Tablestore:刪除資料

更新時間:Jun 30, 2024

Table Store提供了DeleteRow介面用於刪除單行資料以及BatchWriteRow介面用於大量刪除資料。

注意事項

刪除表資料,將導致資料不可恢複,請謹慎操作。

前提條件

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

  • 已建立資料表並寫入資料。

刪除單行資料

調用DeleteRow介面刪除一行資料。如果刪除的行不存在,則不會發生任何變化。

參數

參數

說明

tableName

資料表名稱。

primaryKey

行的主鍵。主鍵包括主鍵列名、主鍵類型和主索引值。

重要

設定的主鍵個數和類型必須與資料表的主鍵個數和類型一致。

condition

支援使用條件更新,可以設定原行的存在性條件或者原行中某列的列值條件。更多資訊,請參見條件更新

樣本

刪除一行資料

以下樣本用於刪除資料表中的指定行資料。

private static void deleteRow(SyncClient client, String pkValue) {
    //構造主鍵。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    //設定資料表名稱。
    RowDeleteChange rowDeleteChange = new RowDeleteChange("<TABLE_NAME>", primaryKey);

    client.deleteRow(new DeleteRowRequest(rowDeleteChange));
}                    

刪除資料時使用條件

以下樣本用於當原行存在且Col0列的值大於100時刪除資料表中的指定行。

private static void deleteRow(SyncClient client, String pkValue) {
    //構造主鍵。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    //設定資料表名稱。
    RowDeleteChange rowDeleteChange = new RowDeleteChange("<TABLE_NAME>", primaryKey);

    //設定條件更新,期望原行存在且Col0列的值大於100時刪除該行。
    Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
    condition.setColumnCondition(new SingleColumnValueCondition("Col0",
            SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
    rowDeleteChange.setCondition(condition);

    client.deleteRow(new DeleteRowRequest(rowDeleteChange));
}                   

大量刪除資料

  1. 刪除資料前,您需要根據實際選擇合適的方式查詢待刪除資料的主鍵資訊。

    • 如果要刪除指定主鍵範圍內的資料,請調用GetRange介面,查詢指定主鍵範圍內的資料,並擷取待刪除資料的主鍵資訊。具體操作,請參見範圍讀取資料

    • 如果要刪除滿足指定條件的資料,請建立多元索引後,使用多元索引查詢滿足指定條件的資料,並擷取待刪除資料的主鍵資訊。具體操作,請參見建立多元索引使用SDK通過多元索引查詢資料

  2. 調用BatchWriteRow介面,根據主鍵資訊大量刪除資料。更多資訊,請參見批量寫入資料

    以下樣本用於刪除一個資料表中主鍵列pk值為"pk"的行資料以及刪除另一個資料表中第一列主鍵pk1值為"pk1"且第二列主鍵pk2值為"pk2"的行資料。

    private static void batchWriteRow(SyncClient client) {    
        BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
    
        //構造rowDeleteChange1。
        PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        pk1Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk"));
        //設定資料表名稱。
        RowDeleteChange rowDeleteChange1 = new RowDeleteChange("<TABLE_NAME1>", pk1Builder.build());
        //添加到batch操作中。
        batchWriteRowRequest.addRowChange(rowDeleteChange1);
    
        //構造rowDeleteChange2。
        PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
        pk2Builder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pk1"));
        pk2Builder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromString("pk2"));
        //設定資料表名稱。
        RowDeleteChange rowDeleteChange2 = new RowDeleteChange("<TABLE_NAME2>", pk2Builder.build());
        //添加到batch操作中。
        batchWriteRowRequest.addRowChange(rowDeleteChange2);
    
        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());
        }
    }