Value provided in ExpressionAttributeNames unused in expressions

TL;DR — ExpressionAttributeNames'te hiçbir ifadenin başvurmadığı bir ad yer tutucusu (örneğin #status) bildirdiniz. DynamoDB, bildirilen her takma adın bir KeyConditionExpression, FilterExpression, UpdateExpression, ConditionExpression veya ProjectionExpression'da kullanılmasını gerektirir. Kullanılmayan takma adı kaldırın — ya da ona başvurması gereken ifadeyi düzeltin.

Ne anlama gelir

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, öznitelik adı takma adları için bir ikame map'idir (ayrılmış sözcükler ya da özel karakterli adlar için gerekir). DynamoDB katı bir iki yönlü sözleşme uygular: bir ifadede kullandığınız her takma ad bildirilmelidir ve bildirdiğiniz her takma ad kullanılmalıdır. Artakalmış, başvurulmayan bir girdi bu HTTP 400 ValidationException'ı tetikler. İstemci tarafındadır ve map, ifadelerle eşleşene kadar yeniden denenebilir değildir.

Neden olur

  • Bir ifadeyi düzenledikten sonra kalan bir bayat takma ad — ifadeden #status = :s'yi kaldırdınız ama #status'ı adlar map'inden silmeyi unuttunuz.
  • Fazla bildirim yapan üretilmiş bir map — bir eşleme katmanı, son ifadenin dokunmadığı öznitelikler için bile takma adlar yaydı.
  • Takma ad adlar map'inde değil, değerler map'inde:status (bir değer) demek istediniz ama #status (bir ad) bildirdiniz.
  • Bir yazım hatası uyuşmazlığı — ifade #stat kullanırken map #status bildiriyor, dolayısıyla #status teknik olarak kullanılmıyor.

Nasıl düzeltilir

  1. Mesajın adını verdiği kullanılmayan takma adı ExpressionAttributeNames'ten silin.
  2. Map'i ifadelerle eşzamanlı tutun — bir #name'i yalnızca bir ifade ona gerçekten başvurduğunda bildirin.
  3. Bir ad-değer karışıklığı olup olmadığını kontrol edin#-takma adları ExpressionAttributeNames'te, :-yer tutucuları ExpressionAttributeValues'te yaşar.
  4. İsteği yeniden üretin, böylece adlar, değerler ve ifade metni elle birleştirilmek yerine birlikte oluşturulsun.

DynoTable'da inceleyin

Hiçbir ifadenin başvurmadığı bir ExpressionAttributeNames girdisi:

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'}}
  })
);

Gerçek çıktı:

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

Mesaj, sorunlu anahtarı adıyla verir; bu da onu, başka hiçbir şey okumadan üzerinde işlem yapabileceğiniz birkaç DynamoDB doğrulama hatasından biri yapar. Genellikle bir düzenleme ifadeden bir yer tutucuyu kaldırıp bildirimini geride bıraktığında ortaya çıkar.

Kaynaklar

Nasıl yeniden oluşturulur

Güncelleme ve filtre düzenleyicilerinde DynoTable takma adlar ayrılmış öznitelik adları — çıktıdaki her #placeholder ifadede referans alınır. ⌘K ile bir tablo açın, bir öğeyi düzenleyin ve oluşturulan ExpressionAttributeNames haritasını kopyalayın.

reserved words checker'deki başarısız SDK isteklerini çapraz kontrol edin — # öneklerine ihtiyaç duyan adlar için takma ad haritasını yazdırır. Profilleri ⌘P ile değiştirin; bkz. Connect to AWS ve Install.

İlgili hatalar

Kaynaklar

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

2026-07-26 tarihinde AWS SDK for JavaScript v3.1095.0 ile DynamoDB Local 2.x'e karşı yeniden üretildi — yukarıdaki çıktı birebir alınmıştır.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.