Como Excluir Vários Itens no DynamoDB
Não existe DELETE FROM table WHERE … no DynamoDB. Cada exclusão mira um
item pela sua chave primária completa — a API não tem operação de exclusão em massa,
não tem truncate, e a instrução DELETE do remove exatamente um item por
instrução. Então "excluir vários itens" é sempre um trabalho de duas etapas: encontrar as
chaves, e então emitir uma exclusão por chave, em lotes para ganhar throughput.
Este guia cobre as opções de lote, a variante transacional tudo-ou-nada, o caso excluir-tudo, e como fazer a mesma coisa com uma seleção e dois atalhos de teclado em uma GUI.
Como excluo vários itens no DynamoDB?
Colete as chaves primárias dos itens que você quer eliminar (via Query ou Scan),
e então exclua-os em lotes: o BatchWriteItem aceita até 25 DeleteRequests
por chamada, o TransactWriteItems exclui até 100 itens atomicamente, e instruções
DELETE do PartiQL podem ser agrupadas 25 por vez com o BatchExecuteStatement.
No DynoTable você seleciona as linhas e pressiona ⌘⌫ para preparar
as exclusões, e então revisa e faz commit.
- Em massa, melhor esforço:
BatchWriteItem— 25 exclusões por chamada, refaça as que sobrarem. - Tudo-ou-nada:
TransactWriteItems— até 100 ações que têm sucesso ou falham juntas. - Sintaxe estilo SQL: PartiQL
DELETE+BatchExecuteStatement— mesma regra por chave, grafia familiar. - Tudo na tabela: estratégias de truncate — geralmente mais barato dropar e recriar a tabela.
- Uma seleção visual: exclusões preparadas no DynoTable — selecione linhas, prepare, revise os diffs vermelhos, faça commit.
Etapa 0: colete as chaves
Uma exclusão precisa da chave primária inteira — em uma tabela de isso é
a chave de partição e a chave de classificação
(AWS:
"Para cada chave primária, você deve fornecer todos os atributos da chave"). Você
não pode excluir por um atributo arbitrário, então "excluir todo item onde
status = 'archived'" começa com uma leitura:
- Se a condição vive em uma chave (ou em uma chave de GSI), um
Querydirecionado coleta as chaves de forma barata. - Caso contrário é um
Scancom filtro — que lê (e cobra) a tabela inteira, com ou sem filtro; veja query vs scan.
Use uma ProjectionExpression que retorne apenas os atributos de chave, e siga o
LastEvaluatedKey até o fim (paginação) ou você vai
silenciosamente excluir apenas o equivalente à primeira página de 1 MB.
Método 1: BatchWriteItem (até 25 exclusões por chamada)
O BatchWriteItem agrupa até 25 requisições de put/delete ou 16 MB por chamada
(referência da API da AWS:
"Uma única chamada de BatchWriteItem pode transmitir até 16MB de dados pela
rede, consistindo em até 25 operações de put ou delete de itens").
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"}}}}
]
}'Três propriedades do lote pegam as pessoas de surpresa — todas direto da referência da API:
- Ele não é atômico. "As operações individuais de
PutItemeDeleteItemespecificadas noBatchWriteItemsão atômicas; porém oBatchWriteItemcomo um todo não é." Algumas exclusões podem entrar enquanto outras não. - Você deve refazer os
UnprocessedItems. Requisições que sofreram throttling voltam no mapaUnprocessedItemsda resposta, no mesmo formato da requisição — "Tipicamente, você chamaria oBatchWriteItemem um loop", e a AWS "recomenda fortemente que você use um algoritmo de exponential backoff" entre as tentativas. - Sem condições. "Você não pode especificar condições em requisições individuais de put e
delete" — uma exclusão condicional tem que passar por um
DeleteItemou uma transação. Um lote também rejeita duas operações na mesma chave em uma chamada.
O formato do loop — fatiar de 25 em 25, enviar, re-enfileirar as sobras com backoff — é o mesmo coberto em operações em lote.
Método 2: TransactWriteItems (exclusões atômicas)
Quando um conjunto de exclusões precisa ter sucesso ou falhar junto — remover um item
pai e os filhos da sua , por exemplo — use o TransactWriteItems: até
100 ações (exclusões, puts, updates, verificações de condição) aplicadas atomicamente,
com por item permitidas. A troca: uma escrita
transacional custa o dobro da capacidade de escrita de uma escrita comum. A mecânica completa
(tokens de idempotência, TransactionCanceledException, matemática de custo) está em
transações do DynamoDB.
Método 3: PartiQL DELETE, em lote
O PartiQL não elimina a regra por chave — ele só a reescreve. O guia do
desenvolvedor é explícito
(PartiQL DELETE):
"Você só pode excluir um item por vez. Você não pode emitir uma única instrução
PartiQL do DynamoDB que exclua vários itens", e a condição WHERE
"deve resolver para um único valor de chave primária".
Para excluir vários itens você agrupa instruções de item único —
o BatchExecuteStatement
roda até 25 instruções por lote (todas leituras ou todas escritas, nunca misturadas):
[
{"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.jsonUm WHERE que não fixa a chave completa falha — não existe
DELETE FROM Orders WHERE status = 'archived'. Mais padrões de PartiQL (e os
limites por trás deles) em exemplos de PartiQL e
PartiQL vs SQL.
Excluindo TODOS os itens (truncate)
O DynamoDB não tem truncate. Suas opções, em ordem de preferência:
- Exclua e recrie a tabela. A exclusão item a item de uma tabela inteira
cobra uma escrita por item;
DeleteTable+CreateTableevita a conta de escritas inteira. O porém: as configurações da tabela — índices, TTL, , modo de capacidade, tags — não voltam sozinhas; você as redeclara na criação (infraestrutura-como-código torna isso um não-evento). - Expire itens com . Se "excluir tudo mais velho que X" é realmente o que você quer, o TTL exclui itens expirados em segundo plano sem consumir capacidade de escrita — uma exclusão em massa em câmera lenta que não custa nada.
- Scan + exclusão em lote (Método 1) quando a tabela precisa continuar no ar e só um subconjunto sai — você paga uma leitura por item escaneado mais uma escrita por item excluído.
Exclua vários itens no DynoTable
O fluxo selecionar-e-excluir acima — consultar, coletar chaves, fatiar, refazer — é exatamente o trabalho braçal que uma GUI deveria assumir. No DynoTable é uma seleção na grade:
- Rode ou filtre uma consulta para que as linhas que você quer eliminar estejam na tela.
- Selecione-as e pressione ⌘⌫ — cada linha selecionada vira uma exclusão preparada. Nada tocou o DynamoDB ainda: as linhas ficam tingidas de vermelho na grade e aparecem como cards revisáveis no painel de preparação.
- Revise, e então faça Commit. Os commits saem como lotes de
TransactWriteItemscom condições de optimistic locking — uma exclusão preparada só passa se o item ainda existir — e preparações grandes são automaticamente fatiadas para ficar dentro dos limites de transação do DynamoDB. ⌘⇧⌫ pula a revisão e exclui-e-commita a seleção em um único atalho.

O escopo é honesto: você exclui as linhas que selecionou — uma operação revisada, recuperável-até-o-commit — não um truncate cego de tabela inteira. Para zerar uma tabela inteira, drope e recrie-a (acima).
Se uma exclusão precisa de uma condição escrita à mão (attribute_exists, uma verificação de
versão), monte a ConditionExpression exata + os mapas de placeholders no
DynamoDB Expression Builder e anexe-a
a um DeleteItem ou a uma transação.
FAQ
Posso excluir vários itens em uma única chamada do DynamoDB?
Sim — até 25 com BatchWriteItem (melhor esforço, refaça os UnprocessedItems)
ou até 100 atomicamente com TransactWriteItems. Ambos exigem uma chave primária
completa por item; nenhum aceita uma condição "where" para selecionar os itens.
Existe DELETE WHERE no DynamoDB?
Não. Nem a API de baixo nível nem o PartiQL conseguem excluir por condição — o
DELETE do PartiQL exige um WHERE que "resolva para um único valor de chave primária".
Você faz query ou scan pelas chaves primeiro, e então exclui cada uma.
Como excluo todos os itens de uma tabela DynamoDB? Para uma limpeza completa, exclua e recrie a tabela — isso evita pagar uma escrita por item. Para limpeza por idade, use TTL, que exclui itens expirados sem consumir capacidade de escrita. Scan + exclusão em lote é o plano B quando a tabela precisa continuar no ar.
Por que itens reaparecem depois do meu batch delete?
Quase sempre UnprocessedItems não refeitos: um BatchWriteItem que sofreu throttling
retorna silenciosamente as exclusões que falharam na resposta, e código que não faz
loop sobre elas "termina" com itens ainda na tabela. Refaça com
exponential backoff até o mapa voltar vazio.
Quanto custa excluir itens? Cada exclusão é uma escrita padrão (uma WCU por 1 KB, dobrada dentro de uma transação), e encontrar as chaves também custa leituras. Estime o estrago com a calculadora de preços.
Prefere ver o que está excluindo primeiro? Baixe o DynoTable — selecione as linhas, prepare as exclusões com ⌘⌫, revise os diffs e faça commit quando tiver certeza.


