DynamoDB は null 値を持てますか?

はい。DynamoDB には、不明または未定義の状態を表す属性のための専用の NULL 型があります。キー以外の属性には空文字列や空のバイナリ値も、さらに空のリストとマップも許されます。許されない のは空のセット(文字列、数値、バイナリ)で、これらは ValidationException で拒否されます。

NULL 型

NULL{"NULL": true} と書く本物の属性型です。フィールドは存在するが値がない、ということを記録したいときに使います。属性そのものを省略するのとは区別されます。

許される「空」

  • 空文字列 / 空バイナリ — キー以外の属性、およびリストやマップの中で許されます。
  • 空のリスト / 空のマップ — 許されます。

許されないもの

  • 空のセット(SS、NS、BS)— ValidationException で拒否されます。
  • キー属性の空文字列またはバイナリ — キーの値は長さが 0 より大きくなければなりません。

拒否はどう見えるか

1 回の PutItem が同じアイテムの中で {"NULL": true}{"S": ""}{"L": []}{"M": {}}、そして 0 バイトの {"B": ""} を受け付け、GetItem は 5 つすべてをそのまま返しました。次の 3 つの書き込みは通りませんでした。メッセージはエンジン自身のもので、幅を合わせて折り返した以外は、誤字も含めて手を加えていません。

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

3 つ目が罠です。アイテムをスパースインデックスから外しておくためにインデックスのキーを null にすることはできません。書き込み全体が拒否されるので、アイテムをインデックスに載せない唯一の方法は属性を省略することです。

NULL は「存在する」と数えられます

どのフィルターも NULL 属性をそこにあるものとして扱います。上のアイテムを attribute_exists(explicitNull) でスキャンすると返ってきましたし、:n{"NULL": true} にした explicitNull = :n でも、attribute_type(explicitNull, "NULL") でも同じです。「明示的に null」と「保存されていない」を切り分けるのは attribute_not_exists だけです。

モデリングのヒント

属性を丸ごと省略するほうが NULL を保存するよりきれいなことが多く、スパースインデックスも使えるようになります。「不在」と「明示的に null」がモデルの中で違う意味を持つかどうかで選んでください。

NULL を軸にしたフィルターの組み立て

フィルター式は NULL を「存在する」とみなします。明示的な null を持つアイテムを探すには、attribute_type(attr, 'NULL') を使うか、{"NULL": true} を入れた :n と比較します。除外したい場合は、モデルに応じて attribute_not_exists を使うか、attribute_type(attr, 'S') のように具体的な型を判定してください。

式ビルダーattribute_existsattribute_not_exists のフィルター用に名前と値のマップを生成するので、費用を払う前に Scan を検算できます。

DynoTable では: アイテムエディタは 3 つの JSON モードすべてで NULL 属性を書き込めます。行を開いてフィールドを null にし、コミット前にレビューできるよう変更をステージしてください。アイテムの編集を参照してください。

さらに詳しく

DynamoDB のデータ型スパースインデックスを読んでください。NULL を含む属性を直接編集するには DynoTable をダウンロードしてください。

参考資料

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

2026-07-28 に @aws-sdk/client-dynamodb 3.1095.0 経由で DynamoDB Local 3.3.0 に対して再現しました — 上記のエラー文字列とフィルターの結果はエンジンの出力そのままの逐語です。実サービスは ValidationException の文言をローカルエンジンと違う形にすることがあります。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。