Google Spanner-Java Mutation:按复合键子集删行报错求助
基于复合键子集删除Cloud Spanner数据行
问题场景
现有Cloud Spanner表结构定义:
CREATE TABLE FOO (KEY1 INT64, KEY2 INT64, KEY3 INT64, VALUE STRING(100)) PRIMARY KEY (KEY1, KEY2, KEY3)
需要批量删除所有匹配KEY1和KEY2固定值(忽略KEY3取值)的数据行,但直接传入仅包含两个主键字段的Key执行删除操作时触发报错:
错误代码示例
Mutation.delete("FOO", KeySet.newBuilder(). addKey(Key.of(key1Value, key2Value)) .build())
报错信息
com.google.cloud.spanner.SpannerException: FAILED_PRECONDITION:
io.grpc.StatusRuntimeException: FAILED_PRECONDITION: Wrong number of
key parts for FOO. Expected: 3. Got: ["943598","213122"]
此前找到的资料仅介绍了完整复合主键匹配删除的方案:该方案仅支持通过指定全部三个主键字段来删除单条或多条明确匹配的行,无法直接适配仅匹配部分主键字段的批量删除需求。
解决方案
Cloud Spanner的Mutation.delete接口若使用Key对象必须指定完整主键,但可以通过**范围键集(KeySet Range)**实现按主键子集匹配的批量删除:通过固定KEY1和KEY2的值,同时指定KEY3覆盖所有可能的取值范围,即可匹配目标数据行。
正确代码示例
// 构建范围起始键:固定KEY1、KEY2,KEY3取INT64类型最小值 Key startKey = Key.of(key1Value, key2Value, Long.MIN_VALUE); // 构建范围结束键:固定KEY1、KEY2,KEY3取INT64类型最大值 Key endKey = Key.of(key1Value, key2Value, Long.MAX_VALUE); // 创建包含该范围的KeySet,设置为闭合范围(包含边界值) KeySet keySet = KeySet.newBuilder() .addRange(KeyRange.newBuilder() .setStart(startKey) .setEnd(endKey) .setStartType(KeyRange.KeyRangeType.CLOSED) .setEndType(KeyRange.KeyRangeType.CLOSED) .build()) .build(); // 生成删除Mutation并执行 Mutation deleteMutation = Mutation.delete("FOO", keySet);
方案说明
- 利用Cloud Spanner主键的有序存储特性,通过覆盖
KEY3的完整取值范围,实现对所有KEY1和KEY2匹配行的批量删除 CLOSED范围类型确保包含KEY3的最小和最大值,不会遗漏任何符合条件的数据行
内容的提问来源于stack exchange,提问作者Rajagopal M
相关产品推荐
相关产品推荐

