

# Diferenças entre um banco de dados relacional (SQL) e o DynamoDB ao modificar dados de uma tabela
<a name="SQLtoNoSQL.UpdateData"></a>

A linguagem SQL fornece a instrução `UPDATE` para modificar dados. O Amazon DynamoDB usa a operação `UpdateItem` para realizar tarefas semelhantes.

**Topics**
+ [Modificar dados em uma tabela com o SQL](#SQLtoNoSQL.UpdateData.SQL)
+ [Modificar dados em uma tabela no DynamoDB](#SQLtoNoSQL.UpdateData.DynamoDB)

## Modificar dados em uma tabela com o SQL
<a name="SQLtoNoSQL.UpdateData.SQL"></a>

No SQL, você usa a instrução `UPDATE` para modificar uma ou mais linhas. A cláusula `SET` especifica novos valores para uma ou mais colunas, e a cláusula `WHERE` determina quais linhas são modificadas. Veja um exemplo a seguir.

```
UPDATE Music
SET RecordLabel = 'Global Records'
WHERE Artist = 'No One You Know' AND SongTitle = 'Call Me Today';
```

Se nenhuma linha corresponder à cláusula `WHERE`, a instrução `UPDATE` não terá efeito.

## Modificar dados em uma tabela no DynamoDB
<a name="SQLtoNoSQL.UpdateData.DynamoDB"></a>

No DynamoDB, você pode usar a API do DynamoDB ou do [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (uma linguagem de consultas compatível com SQL) para modificar um único item. Caso deseje modificar vários itens, você deve usar várias operações.

------
#### [ DynamoDB API ]

Com a API do DynamoDB, use a operação `UpdateItem` para modificar um único item.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ExpressionAttributeValues: {
        ":label": "Global Records"
    }
}
```

Você deve especificar os atributos `Key` do item a ser modificado, e uma `UpdateExpression` para especificar valores de atributo. `UpdateItem` comporta-se como uma operação “upsert”. O item será atualizado se existir na tabela. Do contrário, um novo item será adicionado (inserido).

`UpdateItem` oferece suporte a *gravações condicionais*, nas quais a operação será bem-sucedida apenas se uma `ConditionExpression` específica for verdadeira. Por exemplo, a operação `UpdateItem` a seguir não realiza a atualização, a menos que o preço da música seja maior ou igual a 2,00.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ConditionExpression: "Price >= :p",
    ExpressionAttributeValues: {
        ":label": "Global Records",
        ":p": 2.00
    }
}
```

`UpdateItem` também oferece suporte a *contadores atômicos* ou a atributos do tipo `Number` que podem ser aumentados ou reduzidos. Os contadores atômicos são semelhantes de muitas maneiras a geradores de sequências, colunas de identidade ou campos de incremento automático em bancos de dados SQL. 

Veja a seguir um exemplo de uma operação `UpdateItem` para inicializar um novo atributo (*Plays*) e controlar o número de vezes em que uma música é reproduzida.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET Plays = :val",
    ExpressionAttributeValues: {
        ":val": 0
    },
    ReturnValues: "UPDATED_NEW"
}
```

O parâmetro `ReturnValues` é definido como `UPDATED_NEW`, o que retorna os novos valores de todos os atributos que foram atualizados. Neste caso, ele retorna 0 (zero).

Sempre que alguém reproduzir essa música, podemos usar a operação `UpdateItem` a seguir para aumentar *Plays* por um.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET Plays = Plays + :incr",
    ExpressionAttributeValues: {
        ":incr": 1
    },
    ReturnValues: "UPDATED_NEW"
}
```

------
#### [ PartiQL for DynamoDB ]

Com PartiQL, use a operação `ExecuteStatement` para modificar um item em uma tabela, usando a instrução `Update` PartiQL.

A chave primária dessa tabela consiste em *Artist* e *SongTitle*. Você deve especificar valores para esses atributos.

```
UPDATE Music
SET RecordLabel ='Global Records'
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

Também é possível modificar vários campos de uma só vez, como no exemplo a seguir.

```
UPDATE Music
SET RecordLabel = 'Global Records'
SET AwardsWon = 10
WHERE Artist ='No One You Know' AND SongTitle='Call Me Today'
```

`Update` também oferece suporte a *contadores atômicos* ou a atributos do tipo `Number` que podem ser aumentados ou reduzidos. Os contadores atômicos são semelhantes de muitas maneiras a geradores de sequências, colunas de identidade ou campos de incremento automático em bancos de dados SQL.

Veja a seguir um exemplo de instrução `Update` para inicializar um novo atributo (*Plays*) para controlar o número de vezes em que uma música foi reproduzida.

```
UPDATE Music
SET Plays = 0
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

Sempre que alguém reproduzir essa música, poderemos usar a instrução `Update` a seguir para aumentar *Plays* (Reproduções) em um.

```
UPDATE Music
SET Plays = Plays + 1
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

**nota**  
Para obter exemplos de código que usam `Update` e `ExecuteStatement`, consulte [Instruções Update em PartiQL para DynamoDB](ql-reference.update.md).

------