Valor fornecido em ExpressionAttributeNames não utilizado em expressões

TL;DR — Você declarou um espaço reservado para nome em ExpressionAttributeNames (por exemplo, #status) ao qual nenhuma expressão faz referência. O DynamoDB exige que cada alias declarado seja usado em um KeyConditionExpression, FilterExpression, UpdateExpression, ConditionExpression ou ProjectionExpression. Remova o alias não utilizado ou corrija a expressão que deveria fazer referência a ele.

O que significa

ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in
expressions: keys: {#status}

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in expressions: keys: {#status}

ExpressionAttributeNamesé um mapa de substituição para aliases de nomes de atributos (necessário para palavras reservadas ou nomes com caracteres especiais). O DynamoDB impõe um contrato bidirecional estrito: todo alias que você usa em uma expressão deve ser declarado, **e** todo alias que você declara deve ser usado. Uma entrada restante e não referenciada aciona este HTTP 400ValidationException`. É do lado do cliente e não pode ser repetido até que o mapa corresponda às expressões.

Por que isso acontece

  • Um alias obsoleto deixado após a edição de uma expressão — você removeu #status = :s da expressão, mas esqueceu de excluir #status do mapa de nomes.
  • Um mapa gerado que declara demais — uma camada de mapeamento emitia aliases para cada atributo, mesmo aqueles que a expressão final não toca.
  • O alias está no mapa de valores, não nos nomes — você quis dizer :status (um valor), mas declarou #status (um nome).
  • Incompatibilidade de digitação — a expressão usa #stat enquanto o mapa declara #status, então #status não é tecnicamente utilizado.

Como corrigir

  1. Exclua o alias não utilizado os nomes das mensagens do ExpressionAttributeNames.
  2. Mantenha o mapa em sincronia com as expressões — declare um #name somente quando uma expressão realmente fizer referência a ele.
  3. Verifique se há uma confusão de nome x valor - os aliases # estão ativos no ExpressionAttributeNames, os espaços reservados : no ExpressionAttributeValues.
  4. Gere novamente a solicitação para que nomes, valores e texto de expressão sejam criados juntos, em vez de montados manualmente.

Inspecione no DynoTable

DynoTable cria aliases para nomes de atributos reservados nos editores de atualização e filtro — cada #placeholder na saída é referenciado na expressão. Abra uma tabela com ⌘K, edite um item e copie o mapa ExpressionAttributeNames gerado.

Faça uma verificação cruzada de solicitações de SDK com falha no verificador de palavras reservadas — ele imprime o mapa de alias para nomes que precisam de prefixos #. Alternar perfis com ⌘P; consulte Conectar ao AWS e Instalar.

Fontes

Reproduza

Uma entrada ExpressionAttributeNames à qual nenhuma expressão faz referência:

await client.send(
  new UpdateItemCommand({
    TableName: 'orders',
    Key: {pk: {S: 'ORDER#1'}, sk: {S: 'META'}},
    UpdateExpression: 'SET stat = :v', // note: 'stat', not '#unused'
    ExpressionAttributeNames: {'#unused': 'status'},
    ExpressionAttributeValues: {':v': {S: 'shipped'}}
  })
);

A mensagem nomeia a chave ofensiva, o que torna este um dos poucos erros de validação do DynamoDB nos quais você pode agir sem ler mais nada. Geralmente aparece depois que uma edição remove um espaço reservado da expressão, mas deixa sua declaração para trás.

Erros relacionados

Referências

Última verificação em 13/07/2026 em relação à documentação oficial do AWS vinculada acima.

Reproduzido em 26/07/2026 em DynamoDB Local 2.x com AWS SDK para JavaScript v3.1095.0 - a saída acima é literal.

ValidationException: 1 validation error detected: Value provided in ExpressionAttributeNames unused in expressions: keys: {#unused}
HTTP 400

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.