Возможно ли изменить значение ключа Range в таблице DynamoDB?

Я знаю, что это может быть очень глупый вопрос, но я новичок в DynamoDB.

Мое сомнение в том, возможно ли обновить значение ключа диапазона в DynamoDB.

Предположим, что My Table - "TEST"

{
ID : PK/HK
Date : RK
Name : GSI 
Add : LSI
}

Я хочу изменить атрибут Date.

Начальные значения в таблице:

{
ID = "344"
Date = "5656"
Name = "ABC"
}

Запуск этого кода ниже. Я могу изменить атрибут Name, который является GSI.

Map<String,AttributeValue> item = new HashMap<String,AttributeValue>();
item.put("ID", new AttributeValue("344"));
item.put("Date", new AttributeValue("5656"));

Map<String,AttributeValueUpdate> item1 = new HashMap<String,AttributeValueUpdate>();

AttributeValueUpdate update = new AttributeValueUpdate().withValue(new AttributeValue("AMIT")).withAction("PUT");
item1.put("Name", update);


UpdateItemRequest updateItemreq = new UpdateItemRequest("Test",item,item1);
UpdateItemResult updateItemres = dynamoDBUSEast.updateItem(updateItemreq);

Но когда я меняю эту строку

item1.put("Name", update);

с

 item1.put("Date", update);

Я получаю некоторую ошибку как

Exception in thread "main" com.amazonaws.AmazonServiceException: One or more parameter values were invalid: Cannot update attribute Date. This attribute is part of the key (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: HRRP24Q7C48AMD8ASAI992L6MBVV4KQNSO5AEMVJF66Q9ASUAAJG)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:820)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:439)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:245)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:2908)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:1256)

Итак, возможно ли изменить значение ключа Key?

Ответ 1

Нет, как и состояния сообщения об исключении, вы Cannot update attribute Date. This attribute is part of the key.

Вы также можете увидеть это в AttributeUpdates документации:

Имена атрибутов, подлежащих изменению, действие, выполняемое для каждого, и новое значение для каждого. Если вы обновляете атрибут, который атрибут ключевого индекса для любых индексов в этой таблице, атрибут тип должен соответствовать типу указательного ключа, определенному в AttributesDefinition описания таблицы. Вы можете использовать UpdateItem для обновления любого без ключа атрибуты.

В документации указано, что вы можете обновить любой атрибут для "атрибута, который является атрибутом ключа индекса для любых индексов в этой таблице", а это означает, что при обновлении атрибута, который проецируется на индекс, даже это часть этого индекса, этот индекс также будет обновлен, чтобы отразить исходный элемент.

Ответ 2

Из документов AttributeValueUpdate

Вы не можете использовать UpdateItem для обновления атрибутов первичного ключа. Вместо этого вам нужно будет удалить элемент, а затем использовать PutItem для создайте новый элемент с новыми атрибутами.

Ответ 3

Немного похоронили, но в документах для UpdateItem говорится: "Вы можете использовать UpdateItem для обновления любых атрибутов без ключа".

Итак, в настоящее время единственным способом обновления первичного ключа элемента является удаление старого элемента и запись нового.