Kann DynamoDB Null-Werte haben?
Ja. DynamoDB hat einen eigenen NULL-Typ, der ein Attribut mit unbekanntem oder undefiniertem Zustand darstellt. Es erlaubt außerdem leere Strings und leere Binärwerte auf Nicht-Key-Attributen sowie leere Listen und Maps. Es erlaubt keine leeren Sets (String, Zahl oder Binär) – die werden mit einer ValidationException abgelehnt.
Der NULL-Typ
NULL ist ein echter Attributtyp, geschrieben als {"NULL": true}. Nimm ihn, wenn du festhalten willst, dass ein Feld existiert, aber keinen Wert hat – im Unterschied dazu, das Attribut einfach wegzulassen.
Welche leeren Werte erlaubt sind
- Leerer String / leerer Binärwert – erlaubt auf Nicht-Key-Attributen und innerhalb von Listen und Maps.
- Leere Liste / leere Map – erlaubt.
Was nicht erlaubt ist
- Leere Sets (SS, NS, BS) – werden mit einer
ValidationExceptionabgelehnt. - Leerer String oder Binärwert auf einem Key-Attribut – Key-Werte müssen eine Länge größer als null haben.
Wie die Ablehnungen aussehen
Ein PutItem hat {"NULL": true}, {"S": ""}, {"L": []}, {"M": {}} und ein null Byte großes {"B": ""} im selben Item akzeptiert, und GetItem gab alle fünf unverändert zurück. Diese drei Schreibvorgänge haben es nicht überstanden. Die Meldungen stammen von der Engine selbst, für den Umbruch umgebrochen und sonst unangetastet, Tippfehler inklusive:
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 typeDer dritte Fall ist die Falle. Du kannst einen Index-Key nicht auf null setzen, um ein Item aus einem dünn besetzten Index herauszuhalten: Der ganze Schreibvorgang wird abgelehnt. Die einzige Möglichkeit, ein Item unindiziert zu lassen, ist, das Attribut wegzulassen.
NULL zählt als vorhanden
Jeder Filter behandelt ein NULL-Attribut als vorhanden. Ein Scan über das Item von oben lieferte es mit attribute_exists(explicitNull) zurück, ebenso mit explicitNull = :n und :n auf {"NULL": true} sowie mit attribute_type(explicitNull, "NULL"). Nur attribute_not_exists trennt „ausdrücklich null“ von „nicht gespeichert“.
Tipp zur Modellierung
Ein Attribut ganz wegzulassen ist oft sauberer, als NULL zu speichern, und ermöglicht dünn besetzte Indizes. Entscheide danach, ob „nicht vorhanden“ und „ausdrücklich null“ in deinem Modell Unterschiedliches bedeuten.
Filter rund um NULL bauen
Filterausdrücke behandeln NULL als vorhanden. Um Items mit einem ausdrücklichen Null zu finden, nimm attribute_type(attr, 'NULL') oder vergleiche gegen :n mit {"NULL": true}. Um sie auszuschließen, nimm attribute_not_exists oder prüfe je nach Modell auf einen konkreten Typ wie attribute_type(attr, 'S').
Der Expression Builder erzeugt die Namens- und Wert-Maps für Filter mit attribute_exists und attribute_not_exists, damit du einen Scan auf Plausibilität prüfen kannst, bevor du dafür bezahlst.
In DynoTable: Der Item-Editor schreibt NULL-Attribute in allen drei JSON-Modi. Öffne eine Zeile, setz ein Feld auf null und leg die Änderung zur Prüfung ins Staging, bevor sie committet wird. Siehe Items bearbeiten.
Tiefer einsteigen
Lies DynamoDB-Datentypen und dünn besetzte Indizes. Lade DynoTable herunter, um Attribute – auch NULL – direkt zu bearbeiten.
Referenzen
- 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
Zuletzt überprüft am 13.07.2026 anhand der oben verlinkten offiziellen AWS-Dokumentation.
Reproduziert am 28.07.2026 gegen DynamoDB Local 3.3.0 über @aws-sdk/client-dynamodb 3.1095.0 – die Fehlerzeichenfolgen und Filterergebnisse oben sind wörtliche Engine-Ausgaben. Der Live-Service kann eine ValidationException anders formulieren als die lokale Engine.