表格存储提供了DeleteRow接口用于删除单行数据以及BatchWriteRow接口用于批量删除数据。
注意事项
删除表数据,将导致数据不可恢复,请谨慎操作。
前提条件
- 已初始化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));
}
批量删除数据
删除数据前,您需要根据实际选择合适的方式查询待删除数据的主键信息。
如果要删除指定主键范围内的数据,请调用GetRange接口,查询指定主键范围内的数据,并获取待删除数据的主键信息。具体操作,请参见范围读取数据。
如果要删除满足指定条件的数据,请创建多元索引后,使用多元索引查询满足指定条件的数据,并获取待删除数据的主键信息。具体操作,请参见创建多元索引和使用SDK通过多元索引查询数据。
调用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()); } }