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 duplicates

BatchWriteItem, 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

  1. 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
  2. Python batch_writer'ı kullanıyorsanız boto3'ün overwrite_by_pkeys'ini kullanınbatch_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.
  3. Yinelenenleri giderdikten sonra BatchWriteItem başına 25 işleme parçalayın ve UnprocessedItems'ı yeniden deneyin (kısıtlama — ayrı bir konu).
  4. Aynı anahtarı önce yazıp sonra silmeniz mi gerekiyor? Onları ayrı isteklere bölün ya da TransactWriteItems kullanı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 400

Toplu 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

Kaynaklar

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.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.