Provided list of item keys contains duplicates (BatchWriteItem)
TL;DR — BatchWriteItem isteğiniz, aynı birincil anahtar üzerinde iki veya daha fazla işlem içeriyor (bir anahtarın iki put'u ya da bir put ve bir delete'i). Tek bir toplu istek bir öğe üzerinde birden fazla işlem yapamaz, bu yüzden DynamoDB tüm toplu isteği reddeder. Göndermeden önce yinelenenleri anahtar başına bir işleme birleştirin.
Ne anlama gelir
ValidationException: Provided list of item keys contains duplicatesBatchWriteItem, en fazla 25 put/delete işlemi gerçekleştirir. İstekteki her işlem ayrı bir birincil anahtarı hedeflemelidir. İki PutRequest/DeleteRequest girdisi aynı anahtara (bölüm anahtarı ya da bölüm + sıralama anahtarı) çözümlenirse, DynamoDB tüm çağrıyı bu HTTP 400 ValidationException ile başarısızlığa uğratır — hiçbir şey yazılmaz. Değiştirilmeden yeniden denenebilir değildir.
Neden olur
- Tek bir toplu istekte aynı öğenin iki kez put edilmesi — genellikle bir kaynak listesinde yinelenen kayıtlar olduğunda ve her birini bir
PutRequest'e eşlediğinizde. - Aynı toplu istekte aynı anahtarın bir put ve bir delete'i — hâlâ bir öğe üzerinde iki işlem, hâlâ reddedilir.
- Bir anahtarı tekrarlayan bir olay akışı boyunca yinelenenleri gidermeden toplu istekler oluşturmak.
- Bileşik anahtar gözden kaçması — ayrı olduğunu düşündüğünüz iki satır bölüm + sıralama anahtarını paylaşıyor.
- Parçalamadan önce anahtara göre birleştirmeyen ETL / toplu yükleme işleri (Glue, özel içe aktarıcılar).
Nasıl düzeltilir
- Son yazma kazanacak şekilde anahtar başına bir işleme birleştirin:
import {marshall} from '@aws-sdk/util-dynamodb'; const byKey = new Map(); for (const item of records) { byKey.set(`${item.pk}#${item.sk ?? ''}`, {PutRequest: {Item: marshall(item)}}); } const batch = [...byKey.values()]; // <= one op per key - Python
batch_writer'ı kullanıyorsanız boto3'ünoverwrite_by_pkeys'ini kullanın —batch_writer(overwrite_by_pkeys=['pk', 'sk']), yeni eklenen bir öğenin aynı birincil anahtarı olduğunda tamponlanmış bir isteği düşürür, böylece her anahtar için son yazma kazanır. - Yinelenenleri giderdikten sonra
BatchWriteItembaşına 25 işleme parçalayın veUnprocessedItems'ı yeniden deneyin (kısıtlama — ayrı bir konu). - Aynı anahtarı önce yazıp sonra silmeniz mi gerekiyor? Onları ayrı isteklere bölün ya da
TransactWriteItemskullanın (o da bir öğe üzerinde iki eylemi yasaklar ama niyeti açık hale getirir).
Çalıştırmadan önce bir toplu yüklemeyi mi inceliyorsunuz? DynoTable masaüstü uygulaması öğeleri anahtara göre gösterir, böylece aynı toplu istek için kuyruğa alınan yinelenen anahtarlar öne çıkar.
Nasıl yeniden oluşturulur
Aynı birincil anahtarı iki kez içeren bir BatchWriteItem:
await client.send(
new BatchWriteItemCommand({
RequestItems: {
orders: [
{PutRequest: {Item: {pk: {S: 'DUP'}, sk: {S: 'META'}}}},
{PutRequest: {Item: {pk: {S: 'DUP'}, sk: {S: 'META'}}}}
]
}
})
);Gerçek çıktı:
ValidationException: Provided list of item keys contains duplicates
HTTP 400Toplu isteğin tamamı reddedilir — iki yazmanın hiçbiri gerçekleşmez. Bir toplu isteğin sıralama garantisi olmadığından DynamoDB, iki yinelenenden hangisinin kazanacağına karar vermez; bu yüzden isteği oluşturmadan önce anahtara göre yinelenenleri giderin.
İlgili hatalar
- Provided list of item keys contains duplicates (BatchGetItem) — okuma yolundaki aynı kural.
- ConditionalCheckFailedException — yazma sırasında başarısız olan öğe başına bir koruma.
- Kod örneği: BatchWriteItem in Node.js — uyarlanacak doğru parçalanmış bir toplu yazma.
- Öğrenin: Batch operations
Kaynaklar
- BatchWriteItem — Amazon DynamoDB API Reference
- Amazon DynamoDB — AWS SDK for Python (Boto3) guide (batch_writer / overwrite_by_pkeys)
- TransactWriteItems — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.
2026-07-26 tarihinde AWS SDK for JavaScript v3.1095.0 ile DynamoDB Local 2.x'e karşı yeniden üretildi — yukarıdaki çıktı birebir alınmıştır.