Attribute name is a reserved keyword
TL;DR — 你在一个表达式中直接使用了一个属于 DynamoDB 保留字的属性名(约有 570 个——status、name、size、type、data、year、count 及更多)。把它换成一个 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: nameDynamoDB 保留着一个不能在表达式(UpdateExpression、ConditionExpression、FilterExpression、KeyConditionExpression、ProjectionExpression)中字面出现的保留字列表。当你的属性恰好是其中之一时,解析器会拒绝这个表达式。它是一个 ValidationException(HTTP 400),在你给名称起别名之前不可重试。消息会指明确切的保留字。
为什么会发生
- 一个常见的属性名与保留字冲突——
status、name、size、type、data、year、count、timestamp、source、region以及数百个其他词都是保留的。 - 一个
ProjectionExpression直接列出了一个保留的属性名。 - 一个
FilterExpression/ConditionExpression引用了一个保留名称(#status = :s有效;status = :s无效)。 - 一个以数字开头,或包含空格、点或连字符的属性名——这些也需要一个
ExpressionAttributeNames别名,并产生一个相关的验证错误。
如何修复
- 用
ExpressionAttributeNames给名称起别名。 把一个#placeholder映射到真实名称,并在表达式中使用该占位符:await doc.send( new UpdateCommand({ TableName: 'Orders', Key: {pk: 'ORDER#1'}, UpdateExpression: 'SET #status = :s', ExpressionAttributeNames: {'#status': 'status'}, ExpressionAttributeValues: {':s': 'shipped'} }) ); - 一个占位符必须以
#开头后跟字母数字/下划线,且每个使用的#name都必须定义(每个定义的都被使用)。 - 防御性地起别名——给你表达式中的每个属性名都起别名,就能免于知道哪些词是保留的。
- 给包含字面点的名称用一个单个占位符起别名——一个字面命名为
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 给你表达式中的每个属性名都起别名。
相关错误
- UpdateExpression 语法无效——格式错误的表达式结构。
- ValidationException (overview)
- 代码示例:UpdateItem in Node.js · in Python (boto3)——用 #placeholders 起别名的保留字。
- 学习:Expression names & values · Update expressions
参考资料
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。