¿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 type

Esa 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

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.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.