

# AttributeUpdates (レガシー)
<a name="LegacyConditionalParameters.AttributeUpdates"></a>

**注記**  
可能な限り、これらのレガシーパラメータの代わりに新しい式パラメータを使用することをお勧めします。詳細については、「[DynamoDB での式の使用](Expressions.md)」を参照してください。このパラメータに代わる新しいパラメータの具体的な情報については、「[代わりに *UpdateExpression* を使用します。](#UpdateExpression.instead)」を参照してください。

`UpdateItem` オペレーションでは、レガシー条件パラメータ `AttributeUpdates` に、変更する属性の名前、それぞれに対して実行するアクション、およびそれぞれの新しい値が含まれます。そのテーブル上のインデックスのインデックスキー属性である属性を更新する場合、属性の型は、テーブルの説明の `AttributesDefinition` で定義されたインデックスキーの型に一致する必要があります。`UpdateItem` を使用して非キー属性を更新できます。

属性値を null にすることはできません。文字列型およびバイナリ型属性の長さは、ゼロより大きくなければなりません。セット型の属性を空にすることはできません。空の値を持つリクエストは、`ValidationException` 例外で拒否されます。

各 `AttributeUpdates` 要素は、変更する属性名と次の属性で構成されます。
+  `Value` - この属性の新しい値 (該当する場合)。
+  `Action` - 更新の実行方法を指定する値。このアクションは、データ型が数値またはセットである既存の属性に対してのみ有効です。`ADD` は他のデータ型に使用しないでください。

  指定したプライマリキーを持つ項目がテーブル内に見つかった場合、次の値によって以下のアクションが実行されます。
  +  `PUT` - 指定した属性を項目に追加します。属性がすでに存在する場合は、新しい値で置き換えられます。
  +  `DELETE` - の値が指定されていない場合、属性とその値を削除します。`DELETE`指定した値のデータ型は、既存の値のデータ型と一致する必要があります。

    値のセットが指定されている場合、それらの値が古いセットから削除されます。例えば、属性値が `[a,b,c]` のセットの場合に `DELETE` アクションで `[a,c]` を指定すると、最終的な属性値は `[b]` になります。空のセットを指定するとエラーになります。
  +  `ADD` - 属性が存在しない場合、指定された値を項目に追加します。属性が存在する場合、`ADD` の動作は属性のデータ型によって決まります。
    + 既存の属性が数値で、`Value` も数値である場合、`Value` は既存の属性に数学的に追加されます。`Value` が負の数値である場合は、既存の属性から削除されます。
**注記**  
`ADD` を使用して、更新の前に存在しない項目の数値をインクリメントまたはデクリメントした場合、DynamoDB は初期値として 0 を使用します。  
同様に、更新の前に存在しない属性値をインクリメントまたはデクリメントするために既存の項目に対して `ADD` を使用した場合、DynamoDB は初期値として `0` を使用します。例えば、*itemcount* という属性を持たない項目を更新する際に `ADD` を使用して、この属性に `3` を追加する場合を考えています。この場合、DynamoDB によって *itemcount* 属性が作成され、その初期値が `0` に設定されます。最後に `3` が追加されます。結果は、`3` の値を含む新しい *itemcount* 属性になります。
    + 既存のデータ型がセットで、`Value` もセットである場合、`Value` が既存のセットに追加されます。例えば、属性値が `[1,2]` のセットで、`ADD` アクションで `[3]` が指定されている場合、最終的な属性値は `[1,2,3]` になります。セット属性に対して `ADD` アクションが指定されていて、指定した属性の型が既存のセット型に一致しない場合、エラーが発生します。

      両方のセットは同じプリミティブデータ型を持つ必要があります。例えば、既存のデータ型が文字列のセットである場合、`Value` も文字列のセットである必要があります。

  指定されたキーを持つ項目がテーブルに見つからない場合、次の値は次のアクションを実行します。
  +  `PUT` - DynamoDB で、指定されたプライマリキーで新しい項目が作成され、属性が追加されます。
  +  `DELETE` - 存在しない項目から属性を削除することはできないので何の処理も行われません。オペレーションは成功しますが、DynamoDB は新しい項目を作成しません。
  +  `ADD` - DynamoDB で、指定されたプライマリキーと属性値の番号 (または数字のセット) を持つ項目を作成します。使用できるデータ型は、数値型と数値セット型のみです。

インデックスキーの一部である属性を指定する場合、それらの属性のデータ型は、テーブルの属性定義内のスキーマのデータ型と一致する必要があります。

## 代わりに *UpdateExpression* を使用 - 例
<a name="UpdateExpression.instead"></a>

*Music* テーブル内の項目を変更する場合を考えてみます。次の AWS CLI の例に示すように、`AttributeUpdates` パラメータを含む `UpdateItem` リクエストを使用できます。

```
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"}
        }   
    }'
```

代わりに `UpdateExpression` を使用できます。

```
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"}
    }'
```