DynamoDB 能存 null 值吗?
可以。DynamoDB 有一个专门的 NULL 类型,用来表示一个处于未知或未定义状态的属性。它还允许非键属性使用空字符串和空二进制值,以及空列表和空映射。它不允许空集合(字符串、数字或二进制集合),那会被 ValidationException 拒绝。
NULL 类型
NULL 是一个真实的属性类型,写作 {"NULL": true}。当你想记录"这个字段存在但没有值"时用它——这与干脆省略该属性是不同的。
哪些空值是允许的
- 空字符串 / 空二进制——在非键属性上允许,在列表和映射内部也允许。
- 空列表 / 空映射——允许。
哪些是不允许的
- 空集合(SS、NS、BS)——会被
ValidationException拒绝。 - 键属性上的空字符串或空二进制——键值的长度必须大于零。
这些拒绝长什么样
一次 PutItem 在同一个项目里接受了 {"NULL": true}、{"S": ""}、{"L": []}、{"M": {}} 和一个零字节的 {"B": ""},而 GetItem 把这五个原封不动地返回了。下面这三次写入没能活下来。这些消息是引擎自己的,只做了换行以便排版,其余一字未动,包括其中的笔误:
tags: {"SS": []}
ValidationException: One or more parameter values were invalid:
An string set may not be empty
pk: {"S": ""}
ValidationException: One or more parameter values are not valid.
The AttributeValue for a key attribute cannot contain an empty
string value. Key: pk
gsiKey: {"NULL": true}
ValidationException: Invalid attribute value type第三个才是陷阱。你不能把一个索引键置为 null 来让某个项目待在稀疏索引之外:整次写入会被拒绝,所以让一个项目不被索引的唯一办法是省略那个属性。
NULL 算作"存在"
每一个过滤条件都把 NULL 属性当成在那儿。用 attribute_exists(explicitNull) 扫描上面那个项目会把它返回来,explicitNull = :n(:n 设为 {"NULL": true})也会,attribute_type(explicitNull, "NULL") 同样会。只有 attribute_not_exists 能把"显式为 null"和"没有存储"区分开。
建模提示
完全省略一个属性往往比存一个 NULL 更干净,而且它还能启用稀疏索引。根据"缺失"和"显式为 null"在你的模型里是不是两回事来做选择。
深入了解
阅读 DynamoDB 数据类型和稀疏索引。下载 DynoTable 可以直接编辑属性,包括 NULL。
Expression Builder 为 attribute_exists 和 attribute_not_exists 过滤器生成名称/值映射,以便您可以在付款之前对 Scan 进行健全性检查。
在 DynoTable: 项目编辑器以所有三种 JSON 模式写入 NULL 属性。打开一行,将字段设置为空,并在提交之前暂存更改以供审核。参见Editing items。
深入了解
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- PutItem — Amazon DynamoDB API Reference
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。
2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 复现——上方的错误字符串与过滤结果均为引擎输出,原样照录。实时服务对 ValidationException 的措辞可能与本地引擎不同。
深入了解
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- PutItem — Amazon DynamoDB API Reference
根据上面链接的官方AWS文档上次验证时间为 2026 年 7 月 13 日。
通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 于 2026 年 7 月 28 日转载 — 上面的错误字符串和过滤器结果是逐字引擎输出。实时服务可以用与本地引擎不同的方式来表达 ValidationException。