Supplied AttributeValue is empty, must contain exactly one of the supported datatypes

TL;DR — 你 Item(或键)中的某个属性有一个里面没有值的 AttributeValue——一个空集合、一个键属性中的空字符串/二进制、一个 null/undefined 字段,或一个没有 S/N/BOOL/… 成员的包裹。DynamoDB 要求每个 AttributeValue 恰好持有一个受支持的类型。移除这个空属性或给它一个真实的值。

含义

ValidationException: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes

DynamoDB 在验证一个项目的形态时拒绝了请求:一个 AttributeValue 存在,但携带了 DynamoDB 无法存储的空东西。每个 AttributeValue 都必须恰好包含一个带类型的值(SNBSSNSBSMLNULLBOOL)。它是一个 HTTP 400,不可重试——在你修复该属性之前,同样的项目会再次失败。

这与 ExpressionAttributeValues contains invalid value 不同:那个是关于表达式中的一个 :placeholder;这个是关于项目体本身PutItemBatchWriteItemTransactWriteItems)中的一个属性。

为什么会发生

  • 你正在写入的对象中一个 undefined/null 字段——marshaller 发出了一个空的 AttributeValue,而不是跳过它或给它标 NULL 类型。
  • 一个空的 Set——SSNSBS 必须至少有一个成员。一个空集合在任何地方都无效。
  • 一个键属性中的空字符串——非键的字符串属性可以是 "",但一个表或索引键属性不行。
  • 一个键中的空二进制值——与字符串同样的规则:空二进制对非键属性(以及集合、列表和映射内部)没问题,对一个键则绝不行。
  • 一个埋在你正持久化的 MapList 中的嵌套空集合——嵌套的空_字符串和二进制值_是允许的;嵌套的空_集合_不允许。

如何修复

  1. 在写入前剥离空/undefined 属性。 只从确实有值的字段构建 Item;丢掉其余的,而不是发送一个空包裹。
  2. 对文档客户端,启用空值处理。 @aws-sdk/lib-dynamodbremoveUndefinedValues: true marshal 选项会丢掉 undefined 字段,使它们永不到达网络。(DynamoDB 直接允许非键属性的空字符串和二进制值。)
  3. 绝不发送一个空 Set——当集合没有成员时完全省略该属性,或者存储一个 NULL
  4. 给键属性真实的值——一个分区键/排序键(表或索引)永远不能是空字符串或空二进制。
  5. 遍历嵌套的 Map/List查找杂散的空集合,如果出问题的属性不在顶层。

常见问题

"Supplied AttributeValue is empty" 在 DynamoDB 中是什么意思? 你项目中的一个属性有一个不包含任何存储值的 AttributeValue——一个键属性中的空字符串或二进制、一个空 Set,或一个 null/undefined 字段。每个 AttributeValue 都必须恰好包含一个受支持的数据类型,因此 DynamoDB 拒绝该写入。

我如何阻止 DynamoDB 拒绝空值? 在写入前移除空的和 undefined 的属性(或使用文档客户端的 removeUndefinedValues 选项)。绝不发送一个空 Set——省略该属性或存储一个 NULL。键属性必须始终携带一个真实的、非空的值。

相关错误

参考资料

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

无需控制台即可使用 DynamoDB

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

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