

# BatchWriteItem
<a name="API_BatchWriteItem_v20111205"></a>

**Importante**  
***Esta seção refere-se à versão de API 2011-12-05, que está obsoleta e não deve ser usada para novos aplicativos.***  
 **Para obter a documentação da API de baixo nível atual, consulte a [Referência da API do Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/).**

## Descrição
<a name="API_BatchWriteItems_Description"></a>

Essa operação permite que você insira ou exclua vários itens de várias tabelas em uma única chamada. 

Para fazer upload de um item, você pode usar `PutItem` e, para excluir um item, você pode usar `DeleteItem`. No entanto, quando você deseja enviar ou excluir grandes quantidades de dados, por exemplo, carregar grandes quantidades de dados do Amazon EMR (Amazon EMR) ou migrar dados de outro banco de dados para o DynamoDB, `BatchWriteItem` oferece uma alternativa eficiente. 

Se você usa linguagens como o Java, pode usar threads para carregar itens em paralelo. Isso adiciona complexidade à sua aplicação para manipular os threads. Outras linguagens não oferecem suporte para threads. Por exemplo, se você estiver usando o PHP, deverá carregar ou excluir itens um de cada vez. Em ambas as situações, `BatchWriteItem` fornece uma alternativa na qual as operações de inserção e exclusão especificadas são processadas em paralelo, proporcionando a você o poder da abordagem de pools de threads sem a necessidade de introduzir complexidade no seu aplicativo. 

Observe que cada operação individual de inserção e exclusão especificada em uma operação `BatchWriteItem` tem o mesmo custo em termos de unidades de capacidade consumidas. No entanto, como `BatchWriteItem` realiza as operações especificadas em paralelo, a latência é menor. Operações de exclusão em itens inexistentes consomem 1 unidade de capacidade de gravação. Para obter mais informações sobre unidades de capacidade consumidas, consulte [Trabalhar com tabelas e dados no DynamoDB](WorkingWithTables.md).

Ao usar `BatchWriteItem`, observe as seguintes limitações:
+ **Operações máximas em uma única solicitação**: é possível especificar um total de até 25 operações de inserção ou exclusão. No entanto, o tamanho total da solicitação não pode exceder 1 MB (a carga útil HTTP). 
+ A operação `BatchWriteItem` só pode ser usada para inserir e excluir itens. Ela não pode ser usada para atualizar itens existentes.
+ **Não é uma operação atômica**: operações individuais especificadas em uma `BatchWriteItem` são atômicas. No entanto, `BatchWriteItem` como um todo é uma operação de "melhor esforço", e não uma operação atômica. Ou seja, em uma solicitação `BatchWriteItem`, algumas operações podem ser bem-sucedidas, enquanto outras podem falhar. As operações com falha são retornadas em um campo `UnprocessedItems` na resposta. Algumas dessas falhas podem ocorrer porque você excedeu o throughput provisionado configurado para a tabela ou devido a uma falha transitória, como um erro de rede. Você pode investigar e, opcionalmente, reenviar as solicitações. Em geral, você chama `BatchWriteItem` em um loop e em cada verificação de iteração em busca de itens não processados e envia uma nova solicitação `BatchWriteItem` com esses itens não processados. 
+ **Não retorna itens**: `BatchWriteItem` foi projetada para carregar grandes quantidades de dados de forma eficiente. Ela não oferece algumas das sofisticações oferecidas por `PutItem` e `DeleteItem`. Por exemplo, `DeleteItem` oferece suporte ao campo `ReturnValues` no corpo da solicitação para solicitar o item excluído na resposta. A operação `BatchWriteItem` não retorna itens na resposta.
+ Ao contrário de `PutItem` e `DeleteItem`, `BatchWriteItem` não permite que você especifique condições em solicitações de gravação individuais na operação.
+ Valores de atributos não devem ser nulos, atributos do tipo string e binários devem ter comprimentos maiores que zero, e atributos de tipo definido não podem permanecer vazios. Solicitações que têm valores vazios serão rejeitadas com uma `ValidationException`.

O DynamoDB rejeitará a operação de gravação em lote inteira em qualquer uma das seguintes situações: 
+ Se uma ou mais tabelas especificadas na solicitação `BatchWriteItem` não existir.
+ Se atributos de chaves primárias especificados em um item na solicitação não corresponderem ao esquema de chave primária da tabela correspondente.
+ Se você tentar realizar várias operações no mesmo item na mesma solicitação `BatchWriteItem`. Por exemplo, não é possível inserir e excluir o mesmo item na mesma solicitação `BatchWriteItem`. 
+ Se o tamanho total da solicitação exceder o limite de 1 MB (a carga útil HTTP).
+ Se qualquer item individual em um lote exceder o limite de tamanho de item de 64 KB.

## Solicitações
<a name="API_BatchWriteItems_RequestParameters"></a>

### Sintaxe
<a name="API_BatchWriteItems_RequestParameters.syntax"></a>

```
// This header is abbreviated. For a sample of a complete header, see API de baixo nível do DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.BatchGetItem 
content-type: application/x-amz-json-1.0 

{
  "RequestItems" :  RequestItems
} 

RequestItems
{
     "TableName1" :  [ Request, Request, ... ],
     "TableName2" :  [ Request, Request, ... ],
     ...
}

Request ::=
  PutRequest | DeleteRequest

PutRequest ::=
{
  "PutRequest" : {
     "Item" : {
        "Attribute-Name1" : Attribute-Value,
        "Attribute-Name2" : Attribute-Value,
         ...
     }
  }
}

DeleteRequest ::=
{
   "DeleteRequest" : {
      "Key" : PrimaryKey-Value
   }
}


PrimaryKey-Value ::= HashTypePK | HashAndRangeTypePK

HashTypePK ::=
{ 
   "HashKeyElement" : Attribute-Value
}

HashAndRangeTypePK
{ 
   "HashKeyElement" : Attribute-Value,
   "RangeKeyElement" : Attribute-Value, 
}

Attribute-Value ::= String | Numeric| Binary | StringSet | NumericSet | BinarySet 

Numeric ::=
{
   "N": "Number"
}

String ::=
{
   "S": "String"
}

Binary ::=
{
    "B": "Base64 encoded binary data"
}

StringSet ::=
{
   "SS": [ "String1", "String2", ... ]
}

NumberSet ::=
{
   "NS": [ "Number1", "Number2", ... ]
}  

BinarySet ::=
{
   "BS": [ "Binary1", "Binary2", ... ]
}
```

No corpo da solicitação, o objeto JSON `RequestItems` descreve as operações que você deseja realizar. As operações são agrupadas por tabelas. É possível usar `BatchWriteItem` para atualizar ou excluir vários itens em várias tabelas. Para cada solicitação de gravação específica, você deve identificar o tipo de solicitação (`PutItem`, `DeleteItem`) seguido de informações detalhadas sobre a operação. 
+ Para uma `PutRequest`, você fornece o item, ou seja, uma lista de atributos e seus valores.
+ Para uma `DeleteRequest`, você fornece o nome e o valor da chave primária. 

## Respostas
<a name="API_BatchWriteItems_ResponseElements"></a>

### Sintaxe
<a name="API_BatchWriteItems_ResponseElements.syntax"></a>

Veja a seguir a sintaxe do corpo JSON retornado na resposta.

```
{
  "Responses" :         ConsumedCapacityUnitsByTable
  "UnprocessedItems" :  RequestItems
} 

ConsumedCapacityUnitsByTable
{
    "TableName1" : { "ConsumedCapacityUnits", : NumericValue },
    "TableName2" : { "ConsumedCapacityUnits", : NumericValue },
     ...
}

RequestItems
This syntax is identical to the one described in the JSON syntax in the request.
```

## Erros especiais
<a name="API_BatchWriteItems_SpecialErrors"></a>

Não há erros específicos para esta operação.

## Exemplos
<a name="API_BatchWriteItems_Examples"></a>

O exemplo a seguir mostra uma solicitação HTTP POST e a resposta de uma operação `BatchWriteItem`. A solicitação especifica as seguintes operações nas tabelas Reply e Thread:
+ Inserir um item e excluí-lo da tabela Reply
+ Inserir um item na tabela Thread

Para obter exemplos sobre o uso do AWS SDK, consulte [Trabalhar com itens e atributos no DynamoDB](WorkingWithItems.md).

### Exemplo de solicitação
<a name="API_BatchWriteItems_Examples_Request"></a>

```
// This header is abbreviated. For a sample of a complete header, see API de baixo nível do DynamoDB.
POST / HTTP/1.1
x-amz-target: DynamoDB_20111205.BatchGetItem 
content-type: application/x-amz-json-1.0 

{
  "RequestItems":{
    "Reply":[
      {
        "PutRequest":{
          "Item":{
            "ReplyDateTime":{
              "S":"2012-04-03T11:04:47.034Z"
            },
            "Id":{
              "S":"DynamoDB#DynamoDB Thread 5"
            }
          }
        }
      },
      {
        "DeleteRequest":{
          "Key":{
            "HashKeyElement":{
              "S":"DynamoDB#DynamoDB Thread 4"
            },
            "RangeKeyElement":{
              "S":"oops - accidental row"
            }
          }
        }
      }
    ],
    "Thread":[
      {
        "PutRequest":{
          "Item":{
            "ForumName":{
              "S":"DynamoDB"
            },
            "Subject":{
              "S":"DynamoDB Thread 5"
            }
          }
        }
      }
    ]
  }
}
```

### Exemplo de resposta
<a name="API_BatchWriteItems_Examples_Response"></a>

A seguinte resposta de exemplo mostra uma operação de inserção bem-sucedida nas tabelas Thread e Reply e uma operação de exclusão com falha na tabela Reply (por motivos como a limitação causada quando você excede o throughput provisionado na tabela). Observe o seguinte na resposta JSON:
+ O objeto `Responses` mostra que uma unidade de capacidade foi consumida em ambas as tabelas `Thread` e `Reply` como resultado da operação bem-sucedida em cada uma dessas tabelas. 
+ O objeto `UnprocessedItems` mostra a operação de exclusão que falhou na tabela `Reply`. Em seguida, você pode emitir uma nova chamada `BatchWriteItem` para solucionar essas solicitações não processadas.

```
HTTP/1.1 200 OK
x-amzn-RequestId: G8M9ANLOE5QA26AEUHJKJE0ASBVV4KQNSO5AEMVJF66Q9ASUAAJG
Content-Type: application/x-amz-json-1.0
Content-Length: 536
Date: Thu, 05 Apr 2012 18:22:09 GMT

{
   "Responses":{
      "Thread":{
         "ConsumedCapacityUnits":1.0
      },
      "Reply":{
         "ConsumedCapacityUnits":1.0
      }
   },
   "UnprocessedItems":{
      "Reply":[
         {
            "DeleteRequest":{
               "Key":{
                  "HashKeyElement":{
                     "S":"DynamoDB#DynamoDB Thread 4"
                  },
                  "RangeKeyElement":{
                     "S":"oops - accidental row"
                  }
               }
            }
         }
      ]
   }
}
```