表格存储提供了DeleteRow接口用于删除单行数据以及BatchWriteRow接口用于批量删除数据。
注意事项
删除表数据,将导致数据不可恢复,请谨慎操作。
前提条件
已初始化Client。具体操作,请参见初始化OTSClient。
已创建数据表并写入数据。
删除单行数据
调用DeleteRow接口删除一行数据。如果删除的行不存在,则不会发生任何变化。
接口
// 删除表中的一行。
// @param DeleteRowRequest 执行DeleteRow操作所需参数的封装。
// @return DeleteRowResponse DeleteRow操作的响应内容。
DeleteRow(request *DeleteRowRequest) (*DeleteRowResponse, error)
参数
参数 | 是否必选 | 说明 |
TableName | 是 | 数据表名称。 |
PrimaryKey | 是 | 行的主键。主键包括主键列名、主键类型和主键值。 重要 设置的主键个数和类型必须和数据表的主键个数和类型一致。 |
Condition | 是 | 支持使用条件更新,可以设置原行的存在性条件或者原行中某列的列值条件。更多信息,请参见条件更新。 |
示例
以下示例用于当原行存在且col2列值等于3时删除数据表中的指定行。
func DeleteRowWithCondition(client *tablestore.TableStoreClient, tableName string) {
deleteRowReq := new(tablestore.DeleteRowRequest)
deleteRowReq.DeleteRowChange = new(tablestore.DeleteRowChange)
deleteRowReq.DeleteRowChange.TableName = tableName
deletePk := new(tablestore.PrimaryKey)
deletePk.AddPrimaryKeyColumn("pk1", "pk1value1")
deletePk.AddPrimaryKeyColumn("pk2", int64(2))
deletePk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
deleteRowReq.DeleteRowChange.PrimaryKey = deletePk
//如果忽略行判断条件,请设置行存在性条件为RowExistenceExpectation_IGNORE。
//deleteRowReq.DeleteRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE)
//如果期望行存在,请设置行存在性条件为RowExistenceExpectation_EXPECT_EXIST。
deleteRowReq.DeleteRowChange.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
//设置列条件为col2列值等于3。
clCondition1 := tablestore.NewSingleColumnCondition("col2", tablestore.CT_EQUAL, int64(3))
deleteRowReq.DeleteRowChange.SetColumnCondition(clCondition1)
_, err := client.DeleteRow(deleteRowReq)
if err != nil {
fmt.Println("delete failed with error:", err)
} else {
fmt.Println("delete row finished")
}
}
详细代码请参见DeleteRow@GitHub。
批量删除数据
根据实际情况选择合适的方式查询待删除数据的主键信息。
如果要删除指定主键范围内的数据,请调用GetRange接口,查询指定主键范围内的数据,并获取待删除数据的主键信息。具体操作,请参见范围读取数据。
如果要删除满足指定条件的数据,请创建多元索引后,使用多元索引查询满足指定条件的数据,并获取待删除数据的主键信息。具体操作,请参见创建多元索引和通过SDK使用多元索引。
调用BatchWriteRow接口,根据主键信息批量删除数据。更多信息,请参见批量写入数据。
以下示例用于删除一个数据表中主键列pk值为
"pk"
的行数据以及删除另一个数据表中第一列主键pk1值为"pk1"
且第二列主键pk2值为"pk2"
的行数据。func BatchWriteRowWithCondition(client *tablestore.TableStoreClient) { batchWriteReq := &tablestore.BatchWriteRowRequest{} deleteRowChange := new(tablestore.DeleteRowChange) deleteRowChange.TableName = "<TABLE_NAME1>" deletePk := new(tablestore.PrimaryKey) deletePk.AddPrimaryKeyColumn("pk", "pk") deleteRowChange.PrimaryKey = deletePk deleteRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE) batchWriteReq.AddRowChange(deleteRowChange) deleteRowChange2 := new(tablestore.DeleteRowChange) deleteRowChange2.TableName = "<TABLE_NAME2>" deletePk2 := new(tablestore.PrimaryKey) deletePk2.AddPrimaryKeyColumn("pk1", "pk1") deletePk2.AddPrimaryKeyColumn("pk1", "pk2") deleteRowChange2.PrimaryKey = deletePk2 deleteRowChange2.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST) batchWriteReq.AddRowChange(deleteRowChange2) response, err := client.BatchWriteRow(batchWriteReq) if err != nil { fmt.Println("batch request failed with:", response) } else { fmt.Println("batch write row finished") } }
相关文档
如果要删除指定天数之前的数据,您可以通过为数据表配置数据生命周期的方式自动清理过期数据。具体操作,请参见数据版本和生命周期。