Value provided in ExpressionAttributeNames unused in expressions

TL;DR — Anda mendeklarasikan placeholder nama di ExpressionAttributeNames (misalnya #status) yang tidak dirujuk expression mana pun. DynamoDB mewajibkan setiap alias yang dideklarasikan dipakai di KeyConditionExpression, FilterExpression, UpdateExpression, ConditionExpression, atau ProjectionExpression. Hapus alias yang tidak terpakai — atau betulkan expression yang semestinya merujuknya.

Apa artinya

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 adalah peta substitusi untuk alias nama atribut (dibutuhkan untuk reserved word atau nama dengan karakter khusus). DynamoDB menegakkan kontrak dua arah yang ketat: setiap alias yang Anda pakai di expression harus dideklarasikan, dan setiap alias yang Anda deklarasikan harus dipakai. Satu entri sisa yang tidak dirujuk memicu ValidationException HTTP 400 ini. Ini terjadi di sisi klien dan tidak bisa dicoba ulang sampai peta itu cocok dengan expression-nya.

Mengapa itu terjadi

  • Alias basi yang tertinggal setelah menyunting expression — Anda menghapus #status = :s dari expression tetapi lupa membuang #status dari peta nama.
  • Peta hasil generasi yang mendeklarasikan berlebih — sebuah lapisan pemetaan memancarkan alias untuk setiap atribut, bahkan yang tidak disentuh expression akhirnya.
  • Alias-nya ada di peta values, bukan names — yang Anda maksud :status (sebuah value) tapi Anda deklarasikan #status (sebuah name).
  • Ketidakcocokan akibat salah ketik — expression memakai #stat sementara peta mendeklarasikan #status, jadi secara teknis #status tidak terpakai.

Bagaimana cara memperbaikinya

  1. Hapus alias tak terpakai yang disebut pesan error itu dari ExpressionAttributeNames.
  2. Jaga peta tetap seiring dengan expression — deklarasikan sebuah #name hanya ketika ada expression yang benar-benar merujuknya.
  3. Periksa kemungkinan tertukarnya name dan value — alias # tinggal di ExpressionAttributeNames, placeholder : di ExpressionAttributeValues.
  4. Bangkitkan ulang request-nya agar names, values, dan teks expression dibangun bersama, bukan dirangkai manual.

Periksa di DynoTable

DynoTable mengalias nama atribut reserved di editor update dan filter — setiap #placeholder dalam keluarannya dirujuk di dalam ekspresi. Buka sebuah tabel dengan ⌘K, sunting sebuah item, lalu salin map ExpressionAttributeNames yang dihasilkan.

Periksa silang permintaan SDK yang gagal di pemeriksa kata reserved — alat itu mencetak map alias untuk nama yang membutuhkan awalan #. Ganti profil dengan ⌘P; lihat Menghubungkan ke AWS dan Instal.

Sumber

Cara mereproduksinya

Sebuah entri ExpressionAttributeNames yang tidak dirujuk expression mana pun:

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

Keluaran sebenarnya:

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

Pesannya menyebut key yang bermasalah, yang membuat ini salah satu dari sedikit error validasi DynamoDB yang bisa langsung Anda tindaklanjuti tanpa membaca apa pun lagi. Ia biasanya muncul setelah sebuah suntingan menghapus placeholder dari expression tetapi meninggalkan deklarasinya.

Kesalahan terkait

Referensi

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Direproduksi 2026-07-26 terhadap DynamoDB Local 2.x dengan AWS SDK for JavaScript v3.1095.0 — keluaran di atas dikutip apa adanya.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.