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.
- Masivo, mejor esfuerzo:
BatchWriteItem— 25 eliminaciones por llamada, reintenta las sobrantes. - Todo-o-nada:
TransactWriteItems— hasta 100 acciones que tienen éxito o fallan juntas. - Sintaxis tipo SQL: PartiQL
DELETE+BatchExecuteStatement— la misma regla por clave, con una escritura familiar. - Todo lo de la tabla: estrategias de truncado — normalmente es más barato borrar y recrear la tabla.
- Una selección visual: eliminaciones preparadas en DynoTable — selecciona filas, prepara, revisa los diffs en rojo, confirma.
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
Querydirigida reúne las claves de forma barata. - Si no, es un
Scancon 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
PutItemyDeleteItemespecificadas enBatchWriteItemson atómicas; sin embargo,BatchWriteItemcomo un todo no lo es." Algunas eliminaciones pueden aterrizar mientras otras no. - Debes reintentar los
UnprocessedItems. Las peticiones limitadas por throttling vuelven en el mapaUnprocessedItemsde la respuesta, con la misma forma que la petición — "Típicamente, llamarías aBatchWriteItemen 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
DeleteItemo 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.jsonUn 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:
- Borrar y recrear la tabla. Eliminar una tabla entera elemento a elemento
factura una escritura por elemento;
DeleteTable+CreateTableesquiva 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). - 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.
- 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:
- Ejecuta o filtra una consulta para que las filas que quieres eliminar estén en pantalla.
- 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.
- Revisa y luego Confirma. Las confirmaciones se envían como lotes de
TransactWriteItemscon 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.

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.


