【问题标题】:Cannot delete item from DynamoDB table (java)无法从 DynamoDB 表中删除项目 (java)
【发布时间】:2019-06-12 20:25:43
【问题描述】:

我一直在尝试通过 java 代码从 DynamoDB 中的表中删除一个项目,但我所做的每次尝试都会导致相同的错误:

com.amazonaws.AmazonServiceException:提供的关键元素确实 与架构不匹配(服务:AmazonDynamoDBv2;状态代码:400; 错误代码:ValidationException;

我目前的尝试很简单,看起来像这样:

final DynamoDB dynamoDB = new DynamoDB(new  AmazonDynamoDBClient(credentials));  

Table table =dynamoDB.getTable(tableName);    

DeleteItemSpec itemSpec = new  DeleteItemSpec().withPrimaryKey("cognitoId", cognitoId);  
table.deleteItem(itemSpec);

tablename就是简单的表名,credentials已经验证无误,cognitoId是我的item的实际ID '正在尝试删除。有问题的表有 cognitoId 作为主键,我不明白为什么删除与架构不匹配。该表还有一个排序键或范围键(我不确定它是什么,因为文档很模糊)。我一直在参考这里的文档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key

【问题讨论】:

标签: java amazon-web-services amazon-s3 amazon-dynamodb


【解决方案1】:

您在创建表时是否有排序键?如果是这样,那么您也必须指定排序键,因为您在表上有一个复合键。拥有排序键意味着您可以拥有多个具有相同主键的记录,但是排序键必须是唯一的

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key

排序键在 AWS Dynamo DB 文档和控制台中也可以称为范围或范围键。

所以你的删除项目会是这样的

DeleteItemSpec itemSpec = new DeleteItemSpec().withPrimaryKey("cognitoId", "my_id", "sortKeyField", "sort_key_id");
DeleteItemOutcome outcome = table.deleteItem(itemSpec);

【讨论】:

  • “复合键”是什么意思?
  • 在 DynamoDB 中,主键可以是单属性分区键或复合分区排序键
【解决方案2】:

仅供参考,如果您提供了错误的键名,也会发生这种情况,例如:

DeleteItemSpec itemSpec = new DeleteItemSpec().withPrimaryKey("#NOPENOTMYKEYLOL", "my_id", "sortKeyField", "sort_key_id");
DeleteItemOutcome outcome = table.deleteItem(itemSpec);

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多