Attribute name is a reserved keyword

TL;DR — Anda menggunakan nama atribut yang merupakan salah satu kata reserved DynamoDB (ada ~570 — status, name, size, type, data, year, count, dan banyak lagi) langsung dalam expression. Ganti dengan placeholder ExpressionAttributeNames#status dipetakan ke status — dan permintaan berjalan.

Apa artinya

ValidationException: 1 validation error detected: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: 1 validation error detected: Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: name

DynamoDB menyimpan daftar kata reserved yang tidak dapat muncul secara literal dalam expression (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Ketika atribut Anda kebetulan salah satunya, parser menolak expression. Ini ValidationException (HTTP 400), tidak dapat dicoba ulang sampai Anda meng-alias nama. Pesan menyebut kata reserved yang tepat.

Mengapa itu terjadi

  • Nama atribut umum bertabrakan dengan kata reservedstatus, name, size, type, data, year, count, timestamp, source, region, dan ratusan lainnya reserved.
  • ProjectionExpression yang mendaftarkan nama atribut reserved langsung.
  • FilterExpression/ConditionExpression yang merujuk nama reserved (#status = :s berfungsi; status = :s tidak).
  • Nama atribut yang dimulai dengan angka, atau berisi spasi, titik, atau tanda hubung — ini juga membutuhkan alias ExpressionAttributeNames, dan menghasilkan kesalahan validasi terkait.

Bagaimana cara memperbaikinya

  1. Alias nama dengan ExpressionAttributeNames. Petakan #placeholder ke nama sebenarnya dan gunakan placeholder dalam expression:
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. Placeholder harus dimulai dengan # diikuti alfanumerik/underscore, dan setiap #name yang digunakan harus didefinisikan (dan setiap yang didefinisikan digunakan).
  3. Alias secara defensif — meng-alias setiap nama atribut dalam expression Anda menghindari keharusan mengetahui kata mana yang reserved.
  4. Alias nama yang berisi titik literal dengan placeholder tunggal — atribut yang secara literal bernama Safety.Warning butuh satu alias untuk seluruh nama ({'#sw': 'Safety.Warning'}), karena . yang tidak di-alias dibaca sebagai pemisah document-path. Untuk path yang benar-benar bersarang, alias setiap segmen sebagai gantinya (#pr.#5star).

FAQ

Bagaimana cara memperbaiki "Attribute name is a reserved keyword" di DynamoDB? Alias atribut dengan ExpressionAttributeNames. Petakan placeholder seperti #status ke nama sebenarnya "status" dan gunakan #status dalam expression alih-alih kata literal. Placeholder harus dimulai dengan # dan setiap yang Anda definisikan harus digunakan.

Nama atribut DynamoDB mana yang reserved? Ada sekitar 570 kata reserved, termasuk nama sehari-hari seperti status, name, size, type, data, year, count, timestamp, dan region. Alih-alih menghafal daftar, alias setiap nama atribut dalam expression Anda dengan ExpressionAttributeNames.

Kesalahan terkait

Referensi

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

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.