删除数据

表格存储提供了DeleteRow接口用于删除单行数据以及BatchWriteRow接口用于批量删除数据。

注意事项

删除表数据,将导致数据不可恢复,请谨慎操作。

前提条件

删除单行数据

调用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接口,查询指定主键范围内的数据,并获取待删除数据的主键信息。具体操作,请参见范围读取数据

    • 如果要删除满足指定条件的数据,并且该数据表存在多元索引,请使用多元索引查询满足条件的数据,并获取待删除数据的主键信息。具体操作,请参见基础查询

    • 如果要删除数据表中所有数据,推荐您直接删除该数据表,然后重新创建一张配置相同的数据表。

      您也可以调用GetRange接口,通过设置完整主键范围均为虚拟点INF_MIN(无穷小)和INF_MAX(无穷大)进行全表数据扫描,获取所有数据的主键信息。但是执行此操作会消耗较多计算资源,请谨慎使用。

  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());
        }
    }

相关文档

如果要删除指定天数之前的数据,您可以通过为数据表配置数据生命周期的方式自动清理过期数据。具体操作,请参见数据版本和生命周期