DynamoDB peut-il avoir des valeurs nulles ?

Oui. DynamoDB a un type NULL dédié qui représente un attribut dans un état inconnu ou indéfini. Il accepte aussi les chaînes vides et les valeurs binaires vides pour les attributs hors clé, ainsi que les listes et les maps vides. Il n'accepte pas les ensembles vides (de chaînes, de nombres ou binaires), qui sont rejetés avec une ValidationException.

Le type NULL

NULL est un vrai type d'attribut, écrit {"NULL": true}. Utilise-le quand tu veux enregistrer qu'un champ existe mais n'a pas de valeur — ce qui est distinct du simple fait d'omettre l'attribut.

Quelles valeurs vides sont autorisées

  • Chaîne vide / binaire vide — autorisées sur les attributs hors clé, et à l'intérieur des listes et des maps.
  • Liste vide / map vide — autorisées.

Ce qui n'est pas autorisé

  • Les ensembles vides (SS, NS, BS) — rejetés avec une ValidationException.
  • Une chaîne ou un binaire vide sur un attribut de clé — les valeurs de clé doivent avoir une longueur supérieure à zéro.

À quoi ressemblent les rejets

Un seul PutItem a accepté {"NULL": true}, {"S": ""}, {"L": []}, {"M": {}} et un {"B": ""} de zéro octet dans le même élément, et GetItem a renvoyé les cinq inchangés. Ces trois écritures-là n'ont pas survécu. Les messages sont ceux du moteur, mis en forme pour tenir et par ailleurs intacts, coquille comprise :

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

Le troisième est le piège. Tu ne peux pas mettre à null une clé d'index pour garder un élément hors d'un index creux : l'écriture entière est rejetée, donc le seul moyen de laisser un élément non indexé est d'omettre l'attribut.

NULL compte comme présent

Tous les filtres considèrent qu'un attribut NULL est là. Scanner l'élément ci-dessus avec attribute_exists(explicitNull) l'a renvoyé, tout comme explicitNull = :n avec :n valant {"NULL": true}, et attribute_type(explicitNull, "NULL"). Seul attribute_not_exists distingue « explicitement nul » de « pas stocké ».

Conseil de modélisation

Omettre entièrement un attribut est souvent plus propre que stocker NULL, et ça permet les index creux. Choisis selon que « absent » et « explicitement nul » veulent dire des choses différentes dans ton modèle.

Construire des filtres autour de NULL

Les expressions de filtre traitent NULL comme présent. Pour trouver les éléments porteurs d'un null explicite, utilise attribute_type(attr, 'NULL') ou compare à :n avec {"NULL": true}. Pour les exclure, utilise attribute_not_exists ou teste un type concret comme attribute_type(attr, 'S'), selon ton modèle.

L'expression builder génère les maps de noms et de valeurs pour les filtres attribute_exists et attribute_not_exists, de quoi vérifier un Scan avant de le payer.

Dans DynoTable : l'éditeur d'éléments écrit des attributs NULL dans les trois modes JSON. Ouvre une ligne, mets un champ à null et prépare la modification pour relecture avant qu'elle ne soit validée. Vois Éditer des éléments.

Aller plus loin

Lis les types de données DynamoDB et les index creux. Télécharge DynoTable pour modifier directement des attributs, NULL compris.

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Reproduit le 2026-07-28 contre DynamoDB Local 3.3.0 via @aws-sdk/client-dynamodb 3.1095.0 — les chaînes d'erreur et les résultats de filtre ci-dessus sont la sortie brute du moteur. Le service en production peut formuler une ValidationException autrement que le moteur local.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.