Attribute name is a reserved keyword

TL;DR — 你在一个表达式中直接使用了一个属于 DynamoDB 保留字的属性名(约有 570 个——statusnamesizetypedatayearcount 及更多)。把它换成一个 ExpressionAttributeNames 占位符——#status 映射到 status——请求就通过了。

含义

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 保留着一个不能在表达式(UpdateExpressionConditionExpressionFilterExpressionKeyConditionExpressionProjectionExpression)中字面出现的保留字列表。当你的属性恰好是其中之一时,解析器会拒绝这个表达式。它是一个 ValidationException(HTTP 400),在你给名称起别名之前不可重试。消息会指明确切的保留字。

为什么会发生

  • 一个常见的属性名与保留字冲突——statusnamesizetypedatayearcounttimestampsourceregion 以及数百个其他词都是保留的。
  • 一个 ProjectionExpression 直接列出了一个保留的属性名。
  • 一个 FilterExpression/ConditionExpression 引用了一个保留名称(#status = :s 有效;status = :s 无效)。
  • 一个以数字开头,或包含空格、点或连字符的属性名——这些也需要一个 ExpressionAttributeNames 别名,并产生一个相关的验证错误。

如何修复

  1. ExpressionAttributeNames 给名称起别名。 把一个 #placeholder 映射到真实名称,并在表达式中使用该占位符:
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. 一个占位符必须以 # 开头后跟字母数字/下划线,且每个使用的 #name 都必须定义(每个定义的都被使用)。
  3. 防御性地起别名——给你表达式中的每个属性名都起别名,就能免于知道哪些词是保留的。
  4. 给包含字面点的名称用一个单个占位符起别名——一个字面命名为 Safety.Warning 的属性需要为整个名称用一个别名({'#sw': 'Safety.Warning'}),因为一个未起别名的 . 会被读作文档路径分隔符。对于一个真正嵌套的路径,则给每个段起别名(#pr.#5star)。

常见问题

我如何修复 DynamoDB 中的 "Attribute name is a reserved keyword"? 用 ExpressionAttributeNames 给属性起别名。把一个占位符(例如 #status)映射到真实名称 "status",并在表达式中使用 #status 而不是那个字面词。占位符必须以 # 开头,且你定义的每一个都必须被使用。

哪些 DynamoDB 属性名是保留的? 大约有 570 个保留字,包括像 status、name、size、type、data、year、count、timestamp 和 region 这样的日常名称。与其背下这个列表,不如用 ExpressionAttributeNames 给你表达式中的每个属性名都起别名。

相关错误

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。