Einsteiger7 Min. Lesezeit

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.

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 Query die Schlüssel günstig ein.
  • Andernfalls ist es ein Scan mit 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- und DeleteItem-Operationen in BatchWriteItem sind atomar; BatchWriteItem als Ganzes ist es jedoch nicht." Einige Löschungen können landen, während andere es nicht tun.
  • Du musst UnprocessedItems wiederholen. Gedrosselte Requests kommen in der UnprocessedItems-Antwort-Map zurück, in derselben Form wie der Request — „typischerweise rufst du BatchWriteItem in 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 DeleteItem oder 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.json

Ein 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:

  1. Tabelle löschen und neu anlegen. Eine ganze Tabelle Item für Item zu löschen berechnet einen Schreibvorgang pro Item; DeleteTable + CreateTable umgeht 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).
  2. 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.
  3. 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:

  1. Führe eine Abfrage aus oder filtere sie, sodass die Zeilen, die weg sollen, auf dem Bildschirm sind.
  2. 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.
  3. 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.
Vorgemerkte Löschungen in DynoTable: ausgewählte Zeilen rot getönt im Grid, jede eine prüfbare Karte im Staging-Panel vor dem Commit.
Vorgemerkte Löschungen in DynoTable: ausgewählte Zeilen rot getönt im Grid, jede eine prüfbare Karte im Staging-Panel vor dem Commit.

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.

Aktualisiert