

# Diferencias entre una base de datos relacional (SQL) y DynamoDB al modificar datos de una tabla
<a name="SQLtoNoSQL.UpdateData"></a>

El lenguaje SQL proporciona la instrucción `UPDATE` para modificar datos. Amazon DynamoDB utiliza la operación `UpdateItem` para llevar a cabo tareas semejantes.

**Topics**
+ [Modificación de los datos de una tabla con SQL](#SQLtoNoSQL.UpdateData.SQL)
+ [Modificación de los datos de una tabla en DynamoDB](#SQLtoNoSQL.UpdateData.DynamoDB)

## Modificación de los datos de una tabla con SQL
<a name="SQLtoNoSQL.UpdateData.SQL"></a>

En SQL, se utilizaría la instrucción `UPDATE` para modificar una o varias filas. La cláusula `SET` especifica los nuevos valores de una o varias columnas y la cláusula `WHERE` determina qué filas se modifican. A continuación se muestra un ejemplo.

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

Si no hay ninguna fila que coincida con la cláusula `WHERE`, la instrucción `UPDATE` no surte efecto.

## Modificación de los datos de una tabla en DynamoDB
<a name="SQLtoNoSQL.UpdateData.DynamoDB"></a>

En DynamoDB, puede utilizar la API clásica o [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (un lenguaje de consulta compatible con SQL) para modificar un solo elemento. Si desea modificar varios elementos, debe utilizar varias operaciones.

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

Con la API de DynamoDB, se utiliza la operación `UpdateItem` para modificar un solo elemento.

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

Debe especificar los atributos `Key` del elemento que va a modificar y una expresión `UpdateExpression` para especificar los valores de los atributos. `UpdateItem` se comporta como una operación “upsert”. Si el elemento está presente en tabla, se actualiza y, si no está presente, se agrega (inserta).

`UpdateItem` admite las *escrituras condicionales*, en las que la operación únicamente se lleva a cabo correctamente si una expresión `ConditionExpression` determinada se evalúa en true. Por ejemplo, la operación `UpdateItem` siguiente no lleva a cabo la actualización a no ser que el precio de la canción sea mayor o igual que 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` también admite los *contadores atómicos*, que son atributos del tipo `Number` que se pueden incrementar o reducir. Los contadores atómicos se parecen en muchos aspectos a los generadores de secuencia, las columnas de identidad o los campos de incremento automático de las bases de datos SQL. 

A continuación se muestra un ejemplo de operación `UpdateItem` utilizada para inicializar un nuevo atributo (*Plays*) que permite realizar el seguimiento del número de veces que se ha reproducido una canción.

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

El parámetro `ReturnValues` se establece en `UPDATED_NEW`, que devuelve los nuevos valores de todos los atributos que se han actualizado. En este caso, devuelve 0 (cero).

Cada vez que alguien reproduce esta canción, podemos usar la operación `UpdateItem` para incrementar *Plays* en una unidad.

```
{
    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 ]

Con PartiQL, se utiliza la operación `ExecuteStatement` para modificar un elemento de una tabla, mediante la instrucción `Update` de PartiQL.

La clave principal de esta tabla consta de *Artist* y *SongTitle*. Debe especificar los valores de estos atributos.

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

También puede modificar varios campos a la vez, como en el ejemplo siguiente.

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

`Update` también admite los *contadores atómicos*, que son atributos del tipo `Number` que se pueden incrementar o reducir. Los contadores atómicos se parecen en muchos aspectos a los generadores de secuencia, las columnas de identidad o los campos de incremento automático de las bases de datos SQL.

A continuación, se muestra un ejemplo de instrucción `Update` utilizada para inicializar un nuevo atributo (*Plays* [Reproducciones]) que permite hacer el seguimiento del número de veces que se ha reproducido una canción.

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

Cada vez que alguien reproduce esta canción, podemos usar la instrucción `Update` para aumentar *Plays* (Reproducciones) en una unidad.

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

**nota**  
Para obtener ejemplos de código mediante `Update` y `ExecuteStatement`, consulte [Instrucciones de actualización de PartiQL para DynamoDB](ql-reference.update.md).

------