¿Puede DynamoDB tener valores null?
Sí. DynamoDB tiene un tipo NULL dedicado que representa un atributo con un estado
desconocido o indefinido. También permite cadenas vacías y valores binarios vacíos en
atributos que no son clave, además de listas y mapas vacíos. No permite conjuntos
vacíos (de cadena, número o binario), que se rechazan con una ValidationException.
El tipo NULL
NULL es un tipo de atributo real, escrito como {"NULL": true}. Úsalo cuando quieras
registrar que un campo existe pero no tiene valor — distinto de simplemente omitir el
atributo.
Qué vacíos se permiten
- Cadena vacía / binario vacío — permitidos en atributos que no son clave, y dentro de listas y mapas.
- Lista vacía / mapa vacío — permitidos.
Qué no se permite
- Conjuntos vacíos (SS, NS, BS) — rechazados con una
ValidationException. - Cadena o binario vacío en un atributo clave — los valores de clave deben tener longitud mayor que cero.
Cómo se ven los rechazos
Un PutItem aceptó {"NULL": true}, {"S": ""}, {"L": []}, {"M": {}} y un
{"B": ""} de cero bytes en el mismo Item, y GetItem devolvió los cinco sin cambios.
Estas tres escrituras no sobrevivieron. Los mensajes son del propio motor, envueltos para
encajar y por lo demás intactos, typo incluido:
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 typeEsa tercera es la trampa. No puedes anular con null una clave de índice para mantener un Item fuera de un índice disperso: toda la escritura se rechaza, así que la única forma de dejar un Item sin indexar es omitir el atributo.
NULL cuenta como presente
Cada filtro trata un atributo NULL como presente. Al hacer Scan del Item anterior con
attribute_exists(explicitNull) lo devolvió, y también explicitNull = :n con :n
establecido en {"NULL": true}, y attribute_type(explicitNull, "NULL"). Solo
attribute_not_exists separa «explícitamente null» de «no almacenado».
Consejo de modelado
Omitir un atributo por completo suele ser más limpio que almacenar NULL, y habilita
índices dispersos. Elige según si «ausente» y «explícitamente null» significan cosas
distintas en tu modelo.
Construir filtros en torno a NULL
Las expresiones de filtro tratan NULL como presente. Para encontrar Items con null
explícito, usa attribute_type(attr, 'NULL') o compara contra :n con
{"NULL": true}. Para excluirlos, usa attribute_not_exists o prueba un tipo concreto
como attribute_type(attr, 'S'), según tu modelo.
El Expression Builder genera los mapas de
nombre/valor para filtros attribute_exists y attribute_not_exists para que puedas
comprobar un Scan antes de pagarlo.
En DynoTable: el editor de Items escribe atributos NULL en los tres modos JSON.
Abre una fila, establece un campo en null y prepara el cambio para revisión antes de que
haga commit. Consulta Edición de Items.
Profundiza
Lee Tipos de datos de DynamoDB e índices dispersos. Descarga DynoTable para editar atributos, incluido NULL, directamente.
Referencias
- 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
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.
Reproducido el 2026-07-28 contra DynamoDB Local 3.3.0 vía @aws-sdk/client-dynamodb 3.1095.0 — las cadenas de error y los resultados de filtro anteriores son salida literal del motor. El servicio en vivo puede redactar una ValidationException de forma distinta al motor local.