DynamoDB null değer tutabilir mi?
Evet. DynamoDB'nin, bilinmeyen ya da tanımsız durumda olan bir özniteliği temsil eden özel bir NULL türü vardır. Ayrıca anahtar olmayan öznitelikler için boş dizelere ve boş ikili değerlere, artı boş listelere ve eşlemelere izin verir. Boş kümelere (dize, sayı ya da ikili) ise izin vermez; onlar bir ValidationException ile reddedilir.
NULL türü
NULL, {"NULL": true} olarak yazılan gerçek bir öznitelik türüdür. Bir alanın var olduğunu ama değeri olmadığını kaydetmek istediğinizde kullanın — özniteliği tümüyle atlamaktan farklıdır.
Hangi boşluklara izin verilir
- Boş dize / boş ikili — anahtar olmayan özniteliklerde ve listelerin ile eşlemelerin içinde izinlidir.
- Boş liste / boş eşleme — izinlidir.
Neye izin verilmez
- Boş kümeler (SS, NS, BS) — bir
ValidationExceptionile reddedilir. - Bir anahtar özniteliğinde boş dize ya da ikili — anahtar değerlerinin uzunluğu sıfırdan büyük olmalıdır.
Reddetmeler neye benziyor
Tek bir PutItem, aynı öğede {"NULL": true}, {"S": ""}, {"L": []}, {"M": {}} ve sıfır baytlık bir {"B": ""} kabul etti ve GetItem beşini de değişmeden döndürdü. Şu üç yazma sağ çıkmadı. Mesajlar motorun kendi mesajlarıdır; yalnızca satıra sığsın diye kaydırıldı, yazım hatası dahil başka hiçbir yere dokunulmadı:
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Üçüncüsü tuzaktır. Bir öğeyi bir seyrek indeksin dışında tutmak için bir indeks anahtarını null yapamazsınız: yazmanın tamamı reddedilir, dolayısıyla bir öğeyi indekslenmemiş bırakmanın tek yolu özniteliği atlamaktır.
NULL, var sayılır
Her filtre NULL bir özniteliği orada sayar. Yukarıdaki öğeyi attribute_exists(explicitNull) ile taramak onu döndürdü; :n {"NULL": true} olarak ayarlanmış explicitNull = :n ile attribute_type(explicitNull, "NULL") de öyle. "Açıkça null" ile "saklanmamış"ı yalnızca attribute_not_exists ayırır.
Modelleme ipucu
Bir özniteliği tümüyle atlamak, çoğu zaman NULL saklamaktan daha temizdir ve seyrek indeksleri mümkün kılar. Seçiminizi, modelinizde "yok" ile "açıkça null"un farklı şeyler ifade edip etmediğine göre yapın.
NULL çevresinde filtre kurmak
Filtre ifadeleri NULL'ı var kabul eder. Açık bir null taşıyan öğeleri bulmak için attribute_type(attr, 'NULL') kullanın ya da {"NULL": true} değerli bir :n ile karşılaştırın. Onları dışlamak için modelinize göre attribute_not_exists kullanın ya da attribute_type(attr, 'S') gibi somut bir tür sınayın.
İfade oluşturucu, attribute_exists ve attribute_not_exists filtreleri için ad/değer haritalarını üretir; böylece bir Scan'in parasını ödemeden önce onu gözden geçirebilirsiniz.
DynoTable'da: öğe düzenleyici NULL attribute'ları üç JSON modunun hepsinde yazar. Bir satır açın, bir alanı null yapın ve commit edilmeden önce değişikliği incelenmek üzere hazırlayın. Bkz. Öğeleri düzenleme.
Daha derine inin
DynamoDB veri türlerini ve seyrek indeksleri okuyun. NULL dahil öznitelikleri doğrudan düzenlemek için DynoTable'ı indirin.
Kaynaklar
- 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
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.
2026-07-28 tarihinde @aws-sdk/client-dynamodb 3.1095.0 üzerinden DynamoDB Local 3.3.0'a karşı yeniden üretildi — yukarıdaki hata dizeleri ve filtre sonuçları birebir motor çıktısıdır. Canlı hizmet bir ValidationException'ı yerel motordan farklı ifade edebilir.