Cara Menghapus Banyak Item di DynamoDB
Tidak ada DELETE FROM table WHERE … di DynamoDB. Setiap delete menargetkan
satu Item lewat primary key lengkapnya — API-nya tidak punya operasi
bulk-delete, tidak punya truncate, dan pernyataan DELETE milik
menghapus tepat satu Item per pernyataan. Jadi "menghapus banyak Item" selalu
pekerjaan dua langkah: temukan key-nya, lalu keluarkan satu delete per
key, di-batch demi throughput.
Panduan ini membahas opsi batching, varian transaksional all-or-nothing, kasus hapus-semuanya, dan cara melakukan hal yang sama dengan sebuah seleksi dan dua ketukan tombol di GUI.
Bagaimana cara menghapus banyak Item di DynamoDB?
Kumpulkan primary key dari Item yang ingin Anda hilangkan (lewat Query atau
Scan), lalu hapus dalam batch: BatchWriteItem menerima hingga 25
DeleteRequest per panggilan, TransactWriteItems menghapus hingga 100 Item
secara atomik, dan pernyataan DELETE PartiQL bisa di-batch 25 sekaligus
dengan BatchExecuteStatement. Di DynoTable Anda memilih
baris-barisnya dan menekan ⌘⌫ untuk men-stage delete-nya, lalu
meninjau dan meng-commit.
- Massal, best-effort:
BatchWriteItem— 25 delete per panggilan, retry sisanya. - All-or-nothing:
TransactWriteItems— hingga 100 aksi yang berhasil atau gagal bersama-sama. - Sintaks ala-SQL: PartiQL
DELETE+BatchExecuteStatement— aturan per-key yang sama, ejaan yang akrab. - Semua isi tabel: strategi truncate — biasanya lebih murah men-drop dan membuat ulang tabelnya.
- Seleksi visual: staged delete di DynoTable — pilih baris, stage, tinjau diff merahnya, commit.
Langkah 0: kumpulkan key-nya
Sebuah delete membutuhkan seluruh primary key — pada tabel
itu berarti partition key dan sort key
(AWS:
"For each primary key, you must provide all of the key attributes"). Anda
tidak bisa menghapus lewat atribut sembarangan, jadi "hapus setiap Item di mana
status = 'archived'" dimulai dengan sebuah pembacaan:
- Jika kondisinya hidup pada sebuah key (atau key sebuah GSI),
sebuah
Querytertarget mengumpulkan key-nya dengan murah. - Selain itu, ia adalah sebuah
Scanberfilter — yang membaca (dan menagih) seluruh tabel, dengan atau tanpa filter; lihat query vs scan.
Gunakan sebuah ProjectionExpression yang mengembalikan hanya atribut key,
dan ikuti LastEvaluatedKey sampai habis (paginasi) atau
Anda akan diam-diam menghapus hanya senilai halaman 1 MB pertama.
Metode 1: BatchWriteItem (hingga 25 delete per panggilan)
BatchWriteItem membundel hingga 25 request put/delete atau 16 MB per
panggilan
(AWS API reference:
"A single call to BatchWriteItem can transmit up to 16MB of data over the
network, consisting of up to 25 item put or delete operations").
aws dynamodb batch-write-item --request-items '{
"Orders": [
{"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1001"}, "SK": {"S": "META"}}}},
{"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1002"}, "SK": {"S": "META"}}}},
{"DeleteRequest": {"Key": {"PK": {"S": "ORDER#1003"}, "SK": {"S": "META"}}}}
]
}'Tiga sifat batch ini menjatuhkan orang — semuanya langsung dari API reference:
- Ia tidak atomik. "Operasi
PutItemdanDeleteItemindividual yang ditetapkan dalamBatchWriteItembersifat atomik; namunBatchWriteItemsecara keseluruhan tidak." Sebagian delete bisa mendarat sementara yang lain tidak. - Anda harus me-retry
UnprocessedItems. Request yang di-throttle kembali di peta responsUnprocessedItems, dalam bentuk yang sama dengan request-nya — "biasanya, Anda akan memanggilBatchWriteItemdalam sebuah loop", dan AWS "sangat menyarankan agar Anda menggunakan algoritme exponential backoff" di antara retry. - Tanpa kondisi. "Anda tidak dapat menetapkan kondisi pada request put dan
delete individual" — sebuah delete berkondisi harus lewat
DeleteItematau sebuah transaksi. Sebuah batch juga menolak dua operasi pada key yang sama dalam satu panggilan.
Bentuk loop-nya — potong per 25, kirim, antrekan ulang sisanya dengan backoff — sama dengan yang dibahas di operasi batch.
Metode 2: TransactWriteItems (delete atomik)
Ketika serangkaian delete harus berhasil atau gagal bersama-sama —
misalnya menghapus sebuah Item induk beserta anak-anak -nya —
gunakan TransactWriteItems: hingga 100 aksi (delete, put, update,
condition check) diterapkan secara atomik, dengan
per-Item diperbolehkan. Imbal-baliknya: sebuah penulisan transaksional
berbiaya dua kali write capacity dari penulisan biasa. Mekanika lengkapnya
(token idempotency, TransactionCanceledException, hitungan biaya) ada di
transaksi DynamoDB.
Metode 3: PartiQL DELETE, di-batch
PartiQL tidak mencabut aturan per-key — ia hanya mengejanya ulang. Developer
guide-nya eksplisit
(PartiQL DELETE):
"Anda hanya dapat menghapus satu Item pada satu waktu. Anda tidak dapat
mengeluarkan satu pernyataan PartiQL DynamoDB yang menghapus banyak Item", dan
kondisi WHERE-nya "harus me-resolve ke satu nilai primary key".
Untuk menghapus beberapa Item, Anda mem-batch pernyataan-pernyataan satu-Item —
BatchExecuteStatement
menjalankan hingga 25 pernyataan per batch (semua pembacaan atau semua
penulisan, tidak pernah campur):
[
{"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1001' AND SK = 'META'"},
{"Statement": "DELETE FROM \"Orders\" WHERE PK = 'ORDER#1002' AND SK = 'META'"}
]aws dynamodb batch-execute-statement --statements file://statements.jsonSebuah WHERE yang tidak mengunci key lengkap akan gagal — tidak ada
DELETE FROM Orders WHERE status = 'archived'. Pola PartiQL lainnya (dan
batas-batas di baliknya) ada di contoh PartiQL dan
PartiQL vs SQL.
Menghapus SEMUA Item (truncate)
DynamoDB tidak punya truncate. Opsi Anda, berurutan sesuai preferensi:
- Hapus dan buat ulang tabelnya. Penghapusan Item-per-Item atas seluruh
tabel menagih satu penulisan per Item;
DeleteTable+CreateTablemelewatkan seluruh tagihan penulisan itu. Jebakannya: pengaturan tabel — indeks, TTL, , mode kapasitas, tag — tidak kembali dengan sendirinya; Anda mendeklarasikannya ulang saat pembuatan (infrastructure-as-code membuat ini bukan masalah). - Kedaluwarsakan Item dengan . Jika yang benar-benar Anda inginkan adalah "hapus semua yang lebih tua dari X", TTL menghapus Item yang kedaluwarsa di latar belakang tanpa mengonsumsi write capacity — bulk delete gerak-lambat yang tidak berbiaya apa pun.
- Scan + batch-delete (Metode 1) ketika tabel harus tetap hidup dan hanya sebagian yang pergi — Anda membayar satu pembacaan per Item yang di-scan plus satu penulisan per Item yang dihapus.
Menghapus banyak Item di DynoTable
Alur pilih-lalu-hapus di atas — query, kumpulkan key, potong per batch, retry — persis pekerjaan remeh yang seharusnya dimiliki sebuah GUI. Di DynoTable ia adalah sebuah seleksi grid:
- Jalankan atau filter sebuah query agar baris-baris yang ingin Anda hilangkan ada di layar.
- Pilih baris-barisnya dan tekan ⌘⌫ — setiap baris terpilih menjadi sebuah staged delete. Belum ada yang menyentuh DynamoDB: barisnya berwarna merah di grid dan muncul sebagai kartu yang bisa ditinjau di panel staging.
- Tinjau, lalu Commit. Commit dikirim sebagai batch
TransactWriteItemsdengan kondisi optimistic-locking — sebuah staged delete hanya lolos jika Item-nya masih ada — dan stage yang besar otomatis dipotong-potong agar tetap dalam batas transaksi DynamoDB. ⌘⇧⌫ melewati peninjauan dan menghapus-dan-meng-commit seleksi dalam satu chord.

Cakupannya jujur: Anda menghapus baris yang Anda pilih — operasi yang ditinjau dan bisa dipulihkan-sampai-commit — bukan truncate buta seluruh tabel. Untuk menyapu bersih seluruh tabel, drop dan buat ulang tabelnya (di atas).
Jika sebuah delete butuh kondisi tulisan-tangan (attribute_exists, sebuah
pemeriksaan versi), bangun ConditionExpression + peta placeholder persisnya
di DynamoDB Expression Builder dan
lampirkan ke sebuah DeleteItem atau transaksi.
FAQ
Bisakah saya menghapus banyak Item dalam satu panggilan DynamoDB?
Ya — hingga 25 dengan BatchWriteItem (best-effort, retry UnprocessedItems)
atau hingga 100 secara atomik dengan TransactWriteItems. Keduanya menerima
satu primary key lengkap per Item; tidak satu pun menerima kondisi "where"
untuk memilih Item-nya.
Apakah ada DELETE WHERE di DynamoDB?
Tidak. Baik API level-rendah maupun PartiQL tidak bisa menghapus berdasarkan
kondisi — DELETE PartiQL mensyaratkan sebuah WHERE yang "me-resolve ke
satu nilai primary key". Anda query atau scan key-nya lebih dulu, lalu
menghapus satu per satu.
Bagaimana cara menghapus semua Item di sebuah tabel DynamoDB? Untuk sapu bersih total, hapus dan buat ulang tabelnya — itu menghindari membayar satu penulisan per Item. Untuk pembersihan berbasis umur, gunakan TTL, yang menghapus Item kedaluwarsa tanpa mengonsumsi write capacity. Scan + batch-delete adalah cadangan ketika tabel harus tetap hidup.
Kenapa Item muncul lagi setelah batch delete saya?
Hampir selalu UnprocessedItems yang tidak di-retry: sebuah BatchWriteItem
yang di-throttle diam-diam mengembalikan delete yang gagal di responsnya, dan
kode yang tidak me-loop di atasnya "selesai" dengan Item masih ada di tabel.
Retry dengan exponential backoff sampai petanya kembali kosong.
Berapa biaya menghapus Item? Setiap delete adalah penulisan standar (satu WCU per 1 KB, berlipat dua di dalam transaksi), dan menemukan key-nya juga berbiaya pembacaan. Perkirakan kerusakannya dengan kalkulator harga.
Lebih suka melihat dulu apa yang Anda hapus? Unduh DynoTable — pilih barisnya, stage delete-nya dengan ⌘⌫, tinjau diff-nya, dan commit saat Anda yakin.


