DynamoDB使用PutItemRequest未替换同分区键数据问题咨询
方案1:改成简单主键(最贴合你的需求,推荐)
如果你的逻辑就是每个OrderID对应唯一一条数据,那直接把表的主键改成仅用OrderID作为简单主键(删掉排序键StatusDate)就行。这样之后再调用PutItem,只要OrderID相同,就会直接覆盖原有条目,自动实现“唯一行”的效果,你的现有代码完全不用改,表结构调整好就OK。
方案2:保留复合主键,但通过条件逻辑实现唯一行(不推荐,太复杂)
如果因为业务限制必须保留复合主键,但还是想让同一个OrderID下只有一行数据,那只能走“先删后加”的流程:先通过Query查询该OrderID下的所有条目,再逐个DeleteItem删除,最后再执行PutItem插入新数据。
或者你可以试试给PutItem加条件表达式,但这种方式只能阻止重复创建同一OrderID的条目,没法直接替换,示例代码如下:
req := h.db.PutItemRequest(&dynamodb.PutItemInput{ TableName: aws.String(h.Table), Item: av, // 条件:只有当这个OrderID不存在时才写入,无法更新已有条目 ConditionExpression: aws.String("attribute_not_exists(OrderID)"), })
显然这种方式比方案1麻烦很多,所以优先推荐第一种。
补充小知识
复合主键的设计初衷是让同一个分区键下可以存储多行数据(比如记录一个订单的所有状态变更历史),通过排序键来区分和排序这些行。如果你的需求是每个订单只保留最新的一条数据,那简单主键才是正确的设计方向哦~
内容的提问来源于stack exchange,提问作者hendry
相关产品推荐
相关产品推荐

