

# AttributeUpdates (heredado)
<a name="LegacyConditionalParameters.AttributeUpdates"></a>

**nota**  
Le recomendamos que utilice los nuevos parámetros de expresión en lugar de estos parámetros heredados siempre que sea posible. Para obtener más información, consulte [Uso de expresiones en DynamoDB](Expressions.md). Para obtener información específica sobre el nuevo parámetro que reemplaza a este, [Use *UpdateExpression* en su lugar.](#UpdateExpression.instead). 

En una operación `UpdateItem`, el parámetro condicional heredado `AttributeUpdates` contiene los nombres de los atributos que se van a modificar, su nombre, la acción que se va a llevar a cabo y su nuevo valor. Si va a actualizar un atributo de clave de índice de alguno de los índices de esa tabla, el tipo de atributo debe coincidir con el tipo de clave de índice definido en el elemento `AttributesDefinition` de la descripción de la tabla. Puede utilizar `UpdateItem` para actualizar los atributos sin clave.

Los valores de los atributos no pueden ser null. La longitud de los atributos de tipo String (cadena) y Binary (binario) debe ser mayor que cero. Los atributos de tipo Set (conjunto) no pueden estar vacíos. Las solicitudes con valores vacíos se rechazan con la excepción `ValidationException`.

Cada entrada `AttributeUpdates` consta de un nombre de atributo que se va a modificar, junto con lo siguiente:
+  `Value`: el nuevo valor, si procede, de este atributo.
+  `Action`: un valor que especifica cómo llevar a cabo la actualización. Esta acción solo es válida para un atributo existente cuyo tipo de datos sea Number o que sea un conjunto; no use `ADD` con otros tipos de datos. 

  Si se encuentra en la tabla un elemento con la clave principal especificada, los valores siguientes llevan a cabo estas acciones:
  +  `PUT`: añade el atributo especificado al elemento. Si el atributo ya existe, se sustituye por el nuevo valor. 
  +  `DELETE` - elimina el atributo y su valor, si no se ha especificado ningún valor para `DELETE`. El tipo de datos del valor especificado debe coincidir con el tipo de datos del valor existente.

    Si se especifica un conjunto de valores, entonces esos valores se restarán del conjunto anterior. Por ejemplo, si el valor de atributo era el conjunto `[a,b,c]` y la acción `DELETE` especifica `[a,c]`, entonces el valor final del atributo es `[b]`. Especificar un conjunto vacío es un error.
  +  `ADD`: si el atributo aún no existe, añade el valor especificado al elemento. Si el atributo existe, el comportamiento de `ADD` depende del tipo de datos del atributo:
    + Si el atributo existente es un número y `Value` también es un número, entonces `Value` se suma matemáticamente al atributo existente. Si `Value` es un número negativo, entonces se resta del atributo existente.
**nota**  
Si utiliza `ADD` para sumar o restar de un valor numérico de un elemento que no existía antes de la actualización, DynamoDB utilizará 0 como valor inicial.  
De igual forma, si utiliza `ADD` con un elemento existente para sumar o restar de un valor de un atributo que no existía antes de la actualización, DynamoDB utilizará `0` como valor inicial. Por ejemplo, supongamos que el elemento que desea actualizar no tiene un atributo denominado *itemcount*, pero que, a pesar de ello, usted decide aplicar `ADD` para sumar `3` a este atributo. DynamoDB creará el atributo *itemcount*, establecerá su valor inicial en `0` y, por último, le sumará `3`. El resultado será un nuevo atributo *itemcount*, cuyo valor será `3`.
    + Si el tipo de datos existente es un conjunto y, además, `Value` también es un conjunto, `Value` se adjunta al conjunto existente. Por ejemplo, si el valor del atributo es el conjunto `[1,2]` y la acción `ADD` especifica `[3]`, entonces el valor final del atributo es `[1,2,3]`. Se produce un error si se especifica una acción `ADD` para un atributo de tipo Set y el tipo de atributo especificado no coincide con el tipo de conjunto existente. 

      Ambos conjuntos deben tener el mismo tipo de datos primitivo. Por ejemplo, si el tipo de datos existente es un conjunto de cadenas, `Value` también debe ser un conjunto de cadenas.

  Si no se encuentra en la tabla ningún elemento con la clave especificada, los valores siguientes llevan a cabo estas acciones:
  +  `PUT`: hace que DynamoDB cree un nuevo elemento con la clave principal especificada y, a continuación, agrega el atributo. 
  +  `DELETE`: no sucede nada, porque no se pueden eliminar los atributos de un elemento que no existe. La operación se lleva a cabo, pero DynamoDB no crea ningún elemento nuevo.
  +  `ADD`: hace que DynamoDB cree un elemento con la clave principal y el número (o el conjunto de números) suministrados para el valor del atributo. Los únicos tipos de datos permitidos son Number y Number Set.

Si proporciona atributos que forman parte de una clave de índice, entonces los tipos de datos de tales atributos deberán coincidir con los del esquema de la definición de atributos de la tabla.

## Use *UpdateExpression* en su lugar; ejemplo
<a name="UpdateExpression.instead"></a>

Supongamos que desea modificar un elemento de la tabla *Music*. Podría usar una solicitud `UpdateItem` con un parámetro `AttributeUpdates` como en este ejemplo de la AWS CLI:

```
aws dynamodb update-item \
    --table-name Music \
    --key '{
        "SongTitle": {"S":"Call Me Today"}, 
        "Artist": {"S":"No One You Know"}
    }' \
    --attribute-updates '{
        "Genre": {
            "Action": "PUT", 
            "Value": {"S":"Rock"}
        }   
    }'
```

Puede utilizar `UpdateExpression` en su lugar:

```
aws dynamodb update-item \
    --table-name Music \
    --key '{
        "SongTitle": {"S":"Call Me Today"}, 
        "Artist": {"S":"No One You Know"}
    }' \
    --update-expression 'SET Genre = :g' \ 
    --expression-attribute-values '{
        ":g": {"S":"Rock"}
    }'
```