java 如何在PutItemRequest上强制GSI唯一性

nwlqm0z1  于 2022-10-30  发布在  Java
关注(0)|答案(2)|浏览(118)

我正在尝试使用PutItemRequest将记录插入DynamoDB表,但是,当插入项上的某些值已存在于其他项上时,我不希望插入成功。
下面是请求的代码:

var req = PutItemRequest.builder()
            .tableName(TABLE_NAME)
            .item(getAllValues(settings))
            .conditionExpression("attribute_not_exists(#" + MAC_ADDRESS + ") AND attribute_not_exists(#" + REGISTRATION_CODE + ")")
            .expressionAttributeNames(Map.of("#" + MAC_ADDRESS, MAC_ADDRESS, "#" + REGISTRATION_CODE, REGISTRATION_CODE))
            .build();

该表已经包含一个mac地址为“000000000000”的项,所以当尝试插入另一个具有相同mac地址的项时,我预计上述操作会失败,但插入成功。
我做错了什么?MAC_ADDRESS和REGISTRATION_CODE都是GSI的。

06odsfpq

06odsfpq1#

实现这一点的唯一方法是引入大量开销,这可能不是您的用例的最佳解决方案。
https://aws.amazon.com/blogs/database/simulating-amazon-dynamodb-unique-constraints-using-transactions/的最大值
我建议您重新考虑表模式,允许基表处理唯一性,并基于其他属性建立索引。

plicqrtu

plicqrtu2#

与实际的DDB表不同,GSI和LSI始终允许重复。
您使用什么作为表本身的主键(散列和排序)?
如果您希望DDB强制唯一性,则需要找到一种方法来使用表主键中的唯一属性。

相关问题