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 type3 つ目が罠です。アイテムをスパースインデックスから外しておくためにインデックスのキーを 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_exists と attribute_not_exists のフィルター用に名前と値のマップを生成するので、費用を払う前に Scan を検算できます。
DynoTable では: アイテムエディタは 3 つの JSON モードすべてで NULL 属性を書き込めます。行を開いてフィールドを null にし、コミット前にレビューできるよう変更をステージしてください。アイテムの編集を参照してください。
さらに詳しく
DynamoDB のデータ型とスパースインデックスを読んでください。NULL を含む属性を直接編集するには DynoTable をダウンロードしてください。
参考資料
- 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 の文言をローカルエンジンと違う形にすることがあります。