Wie man mehrere Items in DynamoDB löscht
Es gibt kein DELETE FROM table WHERE … in DynamoDB. Jede Löschung zielt auf ein
Item über seinen vollständigen Primary Key — die API hat keine
Bulk-Delete-Operation, kein Truncate, und das DELETE-Statement von
entfernt genau ein Item pro Statement. „Mehrere Items löschen"
ist also immer ein Zwei-Schritte-Job: die Schlüssel finden, dann eine
Löschung pro Schlüssel absetzen, für den Durchsatz gebündelt.
Dieser Guide behandelt die Batching-Optionen, die transaktionale Alles-oder-nichts-Variante, den Alles-löschen-Fall und wie du dasselbe mit einer Auswahl und zwei Tastenanschlägen in einer GUI erledigst.
Wie lösche ich mehrere Items in DynamoDB?
Sammle die Primary Keys der Items ein, die weg sollen (per Query oder Scan),
und lösche sie dann in Batches: BatchWriteItem nimmt bis zu 25 DeleteRequests
pro Aufruf, TransactWriteItems löscht bis zu 100 Items atomar, und
PartiQL-DELETE-Statements lassen sich mit BatchExecuteStatement zu je 25
bündeln. In DynoTable wählst du die Zeilen aus und drückst
⌘⌫, um die Löschungen vorzumerken, dann prüfst und committest du.
- Bulk, best-effort:
BatchWriteItem— 25 Löschungen pro Aufruf, die Reste wiederholst du. - Alles oder nichts:
TransactWriteItems— bis zu 100 Aktionen, die zusammen gelingen oder scheitern. - SQL-artige Syntax: PartiQL
DELETE+BatchExecuteStatement— dieselbe Pro-Schlüssel-Regel, vertraute Schreibweise. - Alles in der Tabelle: Truncate-Strategien — meist ist es günstiger, die Tabelle zu löschen und neu anzulegen.
- Eine visuelle Auswahl: vorgemerkte Löschungen in DynoTable — Zeilen auswählen, vormerken, die roten Diffs prüfen, committen.
Schritt 0: die Schlüssel einsammeln
Eine Löschung braucht den gesamten Primary Key — auf einer
-Tabelle ist das der Partition Key und der
Sort-Key
(AWS:
„Für jeden Primärschlüssel musst du alle Schlüsselattribute angeben"). Du
kannst nicht über ein beliebiges Attribut löschen, also beginnt „lösche jedes
Item mit status = 'archived'" mit einem Lesevorgang:
- Liegt die Bedingung auf einem Schlüssel (oder einem
GSI-Schlüssel), sammelt eine gezielte
Querydie Schlüssel günstig ein. - Andernfalls ist es ein
Scanmit Filter — der die ganze Tabelle liest (und berechnet), Filter hin oder her; siehe Query vs Scan.
Nutze eine ProjectionExpression, die nur die Schlüsselattribute zurückgibt, und
folge LastEvaluatedKey bis zum Ende (Paginierung) — sonst
löschst du stillschweigend nur den Inhalt der ersten 1-MB-Seite.
Methode 1: BatchWriteItem (bis zu 25 Löschungen pro Aufruf)
BatchWriteItem bündelt bis zu 25 Put-/Delete-Requests oder 16 MB pro
Aufruf
(AWS-API-Referenz:
„Ein einzelner Aufruf von BatchWriteItem kann bis zu 16 MB Daten über das
Netzwerk übertragen, bestehend aus bis zu 25 Item-Put- oder -Delete-Operationen").
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"}}}}
]
}'Drei Eigenschaften des Batches, über die Leute stolpern — alle direkt aus der API-Referenz:
- Er ist nicht atomar. „Die einzelnen
PutItem- undDeleteItem-Operationen inBatchWriteItemsind atomar;BatchWriteItemals Ganzes ist es jedoch nicht." Einige Löschungen können landen, während andere es nicht tun. - Du musst
UnprocessedItemswiederholen. Gedrosselte Requests kommen in derUnprocessedItems-Antwort-Map zurück, in derselben Form wie der Request — „typischerweise rufst duBatchWriteItemin einer Schleife auf", und AWS „empfiehlt dringend", zwischen den Wiederholungen einen exponentiellen Backoff-Algorithmus zu verwenden. - Keine Bedingungen. „Du kannst keine Bedingungen an einzelnen Put- und
Delete-Requests angeben" — eine bedingte Löschung muss stattdessen über
DeleteItemoder eine Transaktion laufen. Ein Batch lehnt außerdem zwei Operationen auf demselben Schlüssel in einem Aufruf ab.
Die Schleifenform — in 25er-Blöcke teilen, senden, die Reste mit Backoff erneut einreihen — ist dieselbe, die in Batch-Operationen behandelt wird.
Methode 2: TransactWriteItems (atomare Löschungen)
Wenn ein Satz von Löschungen zusammen gelingen oder scheitern muss — etwa ein
Parent-Item und seine -Children entfernen —,
nutze TransactWriteItems: bis zu 100 Aktionen (Löschungen, Puts, Updates,
Condition-Checks), atomar angewendet, mit erlaubten
pro Item. Der Preis: Ein
transaktionaler Schreibvorgang kostet die doppelte Schreibkapazität eines
einfachen Schreibvorgangs. Die volle Mechanik (Idempotenz-Tokens,
TransactionCanceledException, Kostenrechnung) steht in
DynamoDB-Transaktionen.
Methode 3: PartiQL DELETE, gebündelt
PartiQL hebt die Pro-Schlüssel-Regel nicht auf — es buchstabiert sie nur anders.
Der Developer Guide ist explizit
(PartiQL DELETE):
„Du kannst nur ein Item auf einmal löschen. Du kannst kein einzelnes
DynamoDB-PartiQL-Statement absetzen, das mehrere Items löscht", und die
WHERE-Bedingung „muss sich zu einem einzelnen Primärschlüsselwert auflösen".
Um mehrere Items zu löschen, bündelst du Einzel-Item-Statements —
BatchExecuteStatement
führt bis zu 25 Statements pro Batch aus (alles Lese- oder alles
Schreibvorgänge, nie gemischt):
[
{"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.jsonEin WHERE, das nicht den vollen Schlüssel festnagelt, schlägt fehl — es gibt
kein DELETE FROM Orders WHERE status = 'archived'. Mehr PartiQL-Muster (und die
Limits dahinter) in PartiQL-Beispielen und
PartiQL vs SQL.
ALLE Items löschen (Truncate)
DynamoDB hat kein Truncate. Deine Optionen, nach Präferenz geordnet:
- Tabelle löschen und neu anlegen. Eine ganze Tabelle Item für Item zu
löschen berechnet einen Schreibvorgang pro Item;
DeleteTable+CreateTableumgeht die gesamte Schreibrechnung. Der Haken: Tabelleneinstellungen — Indizes, TTL, , Kapazitätsmodus, Tags — kommen nicht von allein zurück; du deklarierst sie bei der Erstellung neu (mit Infrastructure-as-Code ein Nicht-Ereignis). - Items mit ablaufen lassen. Wenn „alles löschen, was älter als X ist" wirklich das ist, was du willst, löscht TTL abgelaufene Items im Hintergrund, ohne Schreibkapazität zu verbrauchen — eine Bulk-Löschung in Zeitlupe, die nichts kostet.
- Scan + Batch-Delete (Methode 1), wenn die Tabelle live bleiben muss und nur eine Teilmenge geht — du zahlst einen Lesevorgang pro gescanntem Item plus einen Schreibvorgang pro gelöschtem Item.
Mehrere Items in DynoTable löschen
Der Auswählen-dann-Löschen-Ablauf oben — abfragen, Schlüssel einsammeln, in Blöcke teilen, wiederholen — ist genau die Fleißarbeit, die eine GUI übernehmen sollte. In DynoTable ist es eine Grid-Auswahl:
- Führe eine Abfrage aus oder filtere sie, sodass die Zeilen, die weg sollen, auf dem Bildschirm sind.
- Wähle sie aus und drücke ⌘⌫ — jede ausgewählte Zeile wird zu einer vorgemerkten Löschung. Nichts hat DynamoDB bisher berührt: Die Zeilen färben sich im Grid rot und erscheinen als prüfbare Karten im Staging-Panel.
- Prüfen, dann Commit. Commits gehen als
TransactWriteItems-Batches mit Optimistic-Locking-Bedingungen raus — eine vorgemerkte Löschung geht nur durch, wenn das Item noch existiert — und große Stages werden automatisch in Blöcke geteilt, um innerhalb der Transaktionslimits von DynamoDB zu bleiben. ⌘⇧⌫ überspringt die Prüfung und löscht-und-committet die Auswahl in einem Griff.

Der Umfang ist ehrlich: Du löschst die Zeilen, die du ausgewählt hast — eine geprüfte, bis zum Commit rückholbare Operation — kein blindes Full-Table-Truncate. Um eine ganze Tabelle zu leeren, lösche sie und lege sie neu an (siehe oben).
Wenn eine Löschung eine handgeschriebene Bedingung braucht (attribute_exists,
ein Versions-Check), baue die exakte ConditionExpression + Platzhalter-Maps im
DynamoDB Expression Builder und hänge sie
stattdessen an ein DeleteItem oder eine Transaktion.
FAQ
Kann ich mehrere Items in einem DynamoDB-Aufruf löschen?
Ja — bis zu 25 mit BatchWriteItem (best-effort, UnprocessedItems
wiederholen) oder bis zu 100 atomar mit TransactWriteItems. Beide verlangen
einen vollständigen Primary Key pro Item; keiner akzeptiert eine
„Where"-Bedingung zur Auswahl der Items.
Gibt es ein DELETE WHERE in DynamoDB?
Nein. Weder die Low-Level-API noch PartiQL können nach Bedingung löschen —
PartiQLs DELETE verlangt ein WHERE, das sich „zu einem einzelnen
Primärschlüsselwert auflöst". Du fragst die Schlüssel zuerst per Query oder Scan
ab und löschst dann jeden einzeln.
Wie lösche ich alle Items in einer DynamoDB-Tabelle? Für eine Komplettleerung lösche die Tabelle und lege sie neu an — das vermeidet einen Schreibvorgang pro Item. Für altersbasiertes Aufräumen nutze TTL, das abgelaufene Items löscht, ohne Schreibkapazität zu verbrauchen. Scan + Batch-Delete ist der Fallback, wenn die Tabelle live bleiben muss.
Warum tauchen Items nach meinem Batch-Delete wieder auf?
Fast immer nicht wiederholte UnprocessedItems: Ein gedrosseltes
BatchWriteItem gibt die fehlgeschlagenen Löschungen stillschweigend in der
Antwort zurück, und Code, der nicht über sie schleift, ist „fertig", während
noch Items in der Tabelle sind. Wiederhole mit exponentiellem Backoff, bis die
Map leer zurückkommt.
Wie viel kostet das Löschen von Items? Jede Löschung ist ein normaler Schreibvorgang (eine WCU pro 1 KB, verdoppelt innerhalb einer Transaktion), und die Schlüssel zu finden kostet auch Lesevorgänge. Schätze den Schaden mit dem Preisrechner.
Willst du lieber erst sehen, was du löschst? Lade DynoTable herunter — wähle die Zeilen aus, merke die Löschungen mit ⌘⌫ vor, prüfe die Diffs und committe, wenn du sicher bist.


