Principiante8 min de lectura

Cómo eliminar varios elementos en DynamoDB

No existe DELETE FROM table WHERE … en DynamoDB. Cada eliminación apunta a un elemento por su clave principal completa — la API no tiene operación de eliminación masiva ni truncate, y la sentencia DELETE de elimina exactamente un elemento por sentencia. Así que "eliminar varios elementos" es siempre un trabajo en dos pasos: encontrar las claves y luego emitir una eliminación por clave, agrupadas en lotes para el rendimiento.

Esta guía cubre las opciones de agrupación en lotes, la variante transaccional todo-o-nada, el caso de eliminarlo todo, y cómo hacer lo mismo con una selección y dos pulsaciones de teclado en una GUI.

¿Cómo elimino varios elementos en DynamoDB?

Reúne las claves principales de los elementos que quieres eliminar (mediante Query o Scan) y luego elimínalos por lotes: BatchWriteItem acepta hasta 25 DeleteRequest por llamada, TransactWriteItems elimina hasta 100 elementos de forma atómica, y las sentencias DELETE de PartiQL pueden agruparse de 25 en 25 con BatchExecuteStatement. En DynoTable seleccionas las filas y pulsas ⌘⌫ para preparar las eliminaciones, y luego revisas y confirmas.

Paso 0: reunir las claves

Una eliminación necesita la clave principal entera — en una tabla de eso es la clave de partición y la clave de ordenación (AWS: "Para cada clave principal, debes proporcionar todos los atributos de la clave"). No puedes eliminar por un atributo arbitrario, así que "eliminar cada elemento donde status = 'archived'" empieza con una lectura:

  • Si la condición vive en una clave (o en la clave de un GSI), una Query dirigida reúne las claves de forma barata.
  • Si no, es un Scan con un filtro — que lee (y factura) la tabla entera, con o sin filtro; consulta query vs scan.

Usa una ProjectionExpression que devuelva solo los atributos de la clave, y sigue la LastEvaluatedKey hasta el final (paginación) o eliminarás en silencio solo lo que cabe en la primera página de 1 MB.

Método 1: BatchWriteItem (hasta 25 eliminaciones por llamada)

BatchWriteItem agrupa hasta 25 peticiones de put/delete o 16 MB por llamada (referencia de la API de AWS: "Una única llamada a BatchWriteItem puede transmitir hasta 16 MB de datos por la red, consistiendo en hasta 25 operaciones de put o delete de elementos").

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"}}}}
  ]
}'

Tres propiedades del lote hacen tropezar a la gente — todas directamente de la referencia de la API:

  • No es atómico. "Las operaciones individuales PutItem y DeleteItem especificadas en BatchWriteItem son atómicas; sin embargo, BatchWriteItem como un todo no lo es." Algunas eliminaciones pueden aterrizar mientras otras no.
  • Debes reintentar los UnprocessedItems. Las peticiones limitadas por throttling vuelven en el mapa UnprocessedItems de la respuesta, con la misma forma que la petición — "Típicamente, llamarías a BatchWriteItem en un bucle", y AWS "recomienda encarecidamente que uses un algoritmo de backoff exponencial" entre reintentos.
  • Sin condiciones. "No puedes especificar condiciones en las peticiones individuales de put y delete" — una eliminación condicional tiene que pasar por DeleteItem o por una transacción. Un lote también rechaza dos operaciones sobre la misma clave en una llamada.

La forma del bucle — trocear de 25 en 25, enviar, re-encolar las sobrantes con backoff — es la misma que se cubre en operaciones por lotes.

Método 2: TransactWriteItems (eliminaciones atómicas)

Cuando un conjunto de eliminaciones debe tener éxito o fallar junto — eliminar un elemento padre y sus hijos de la , por ejemplo — usa TransactWriteItems: hasta 100 acciones (eliminaciones, puts, updates, comprobaciones de condición) aplicadas de forma atómica, con por elemento permitidas. El precio: una escritura transaccional cuesta el doble de capacidad de escritura que una escritura normal. La mecánica completa (tokens de idempotencia, TransactionCanceledException, las cuentas del coste) está en transacciones de DynamoDB.

Método 3: PartiQL DELETE, por lotes

PartiQL no levanta la regla por clave — solo la reescribe. La guía para desarrolladores es explícita (PartiQL DELETE): "Solo puedes eliminar un elemento a la vez. No puedes emitir una única sentencia PartiQL de DynamoDB que elimine varios elementos", y la condición WHERE "debe resolverse a un único valor de clave principal".

Para eliminar varios elementos agrupas sentencias de un solo elemento — BatchExecuteStatement ejecuta hasta 25 sentencias por lote (todas lecturas o todas escrituras, nunca mezcladas):

[
  {"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

Un WHERE que no fije la clave completa falla — no existe DELETE FROM Orders WHERE status = 'archived'. Más patrones de PartiQL (y los límites que hay detrás) en ejemplos de PartiQL y PartiQL vs SQL.

Eliminar TODOS los elementos (truncate)

DynamoDB no tiene truncate. Tus opciones, en orden de preferencia:

  1. Borrar y recrear la tabla. Eliminar una tabla entera elemento a elemento factura una escritura por elemento; DeleteTable + CreateTable esquiva la factura de escrituras por completo. La pega: la configuración de la tabla — índices, TTL, , modo de capacidad, etiquetas — no vuelve sola; la re-declaras al crearla (con infraestructura como código esto no es ningún drama).
  2. Expirar elementos con . Si lo que realmente quieres es "eliminar todo lo más antiguo que X", TTL elimina los elementos expirados en segundo plano sin consumir capacidad de escritura — una eliminación masiva a cámara lenta que no cuesta nada.
  3. Scan + eliminación por lotes (Método 1) cuando la tabla debe seguir viva y solo se va un subconjunto — pagas una lectura por elemento escaneado más una escritura por elemento eliminado.

Eliminar varios elementos en DynoTable

El flujo de seleccionar-y-eliminar de arriba — consultar, reunir claves, trocear, reintentar — es exactamente el trabajo rutinario que una GUI debería asumir. En DynoTable es una selección en la cuadrícula:

  1. Ejecuta o filtra una consulta para que las filas que quieres eliminar estén en pantalla.
  2. Selecciónalas y pulsa ⌘⌫ — cada fila seleccionada se convierte en una eliminación preparada. Nada ha tocado DynamoDB todavía: las filas se tiñen de rojo en la cuadrícula y aparecen como tarjetas revisables en el panel de preparación.
  3. Revisa y luego Confirma. Las confirmaciones se envían como lotes de TransactWriteItems con condiciones de bloqueo optimista — una eliminación preparada solo se aplica si el elemento todavía existe — y los lotes grandes se trocean automáticamente para mantenerse dentro de los límites de transacción de DynamoDB. ⌘⇧⌫ se salta la revisión y elimina-y-confirma la selección en un solo atajo.
Eliminaciones preparadas en DynoTable: las filas seleccionadas teñidas de rojo en la cuadrícula, cada una como tarjeta revisable en el panel de preparación antes de confirmar.
Eliminaciones preparadas en DynoTable: las filas seleccionadas teñidas de rojo en la cuadrícula, cada una como tarjeta revisable en el panel de preparación antes de confirmar.

El alcance es honesto: eliminas las filas que seleccionaste — una operación revisada y recuperable hasta el momento de confirmar — no un truncado ciego de toda la tabla. Para vaciar una tabla entera, bórrala y recréala (arriba).

Si una eliminación necesita una condición escrita a mano (attribute_exists, una comprobación de versión), construye la ConditionExpression exacta + los mapas de marcadores en el Constructor de expresiones de DynamoDB y adjúntala a un DeleteItem o a una transacción.

Preguntas frecuentes

¿Puedo eliminar varios elementos en una sola llamada de DynamoDB? Sí — hasta 25 con BatchWriteItem (mejor esfuerzo, reintenta los UnprocessedItems) o hasta 100 de forma atómica con TransactWriteItems. Ambos requieren una clave principal completa por elemento; ninguno acepta una condición "where" para seleccionar los elementos.

¿Existe un DELETE WHERE en DynamoDB? No. Ni la API de bajo nivel ni PartiQL pueden eliminar por condición — el DELETE de PartiQL requiere un WHERE que "se resuelva a un único valor de clave principal". Primero consultas o escaneas para obtener las claves, y luego eliminas cada una.

¿Cómo elimino todos los elementos de una tabla de DynamoDB? Para un vaciado completo, borra y recrea la tabla — evita pagar una escritura por elemento. Para limpiezas por antigüedad, usa TTL, que elimina los elementos expirados sin consumir capacidad de escritura. Scan + eliminación por lotes es el plan B cuando la tabla debe seguir viva.

¿Por qué reaparecen elementos después de mi eliminación por lotes? Casi siempre son UnprocessedItems sin reintentar: un BatchWriteItem con throttling devuelve en silencio las eliminaciones fallidas en la respuesta, y el código que no itera sobre ellas "termina" con elementos todavía en la tabla. Reintenta con backoff exponencial hasta que el mapa vuelva vacío.

¿Cuánto cuesta eliminar elementos? Cada eliminación es una escritura estándar (una WCU por 1 KB, el doble dentro de una transacción), y encontrar las claves también cuesta lecturas. Estima el daño con la calculadora de precios.

¿Prefieres ver lo que estás eliminando primero? Descarga DynoTable — selecciona las filas, prepara las eliminaciones con ⌘⌫, revisa los diffs y confirma cuando estés seguro.

Actualizado