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 Builderattribute_existsattribute_not_exists 过滤器生成名称/值映射,以便您可以在付款之前对 Scan 进行健全性检查。

在 DynoTable: 项目编辑器以所有三种 JSON 模式写入 NULL 属性。打开一行,将字段设置为空,并在提交之前暂存更改以供审核。参见Editing items

深入了解

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

2026-07-28 通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 复现——上方的错误字符串与过滤结果均为引擎输出,原样照录。实时服务对 ValidationException 的措辞可能与本地引擎不同。

深入了解

根据上面链接的官方AWS文档上次验证时间为 2026 年 7 月 13 日。

通过 @aws-sdk/client-dynamodb 3.1095.0 针对 DynamoDB Local 3.3.0 于 2026 年 7 月 28 日转载 — 上面的错误字符串和过滤器结果是逐字引擎输出。实时服务可以用与本地引擎不同的方式来表达 ValidationException

无需控制台即可使用 DynamoDB

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

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