

# テーブル内のデータを変更するときのリレーショナル (SQL) データベースと DynamoDB の相違点
<a name="SQLtoNoSQL.UpdateData"></a>

SQL 言語は、データを変更するための `UPDATE` ステートメントを提供します。Amazon DynamoDB は、この `UpdateItem` オペレーションを使用して同様のタスクを実行します。

**Topics**
+ [SQL を使用してテーブルのデータを変更する](#SQLtoNoSQL.UpdateData.SQL)
+ [DynamoDB でテーブルのデータを変更する](#SQLtoNoSQL.UpdateData.DynamoDB)

## SQL を使用してテーブルのデータを変更する
<a name="SQLtoNoSQL.UpdateData.SQL"></a>

SQL では、`UPDATE` ステートメントを使用して、1 つ以上の行を変更します。`SET` 句は、1 つ以上の行に新しい値を指定し、`WHERE` 句は変更する行を決定します。以下はその例です。

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

`WHERE` 句に行が一致しない場合、`UPDATE` ステートメントは何も実行しません。

## DynamoDB でテーブルのデータを変更する
<a name="SQLtoNoSQL.UpdateData.DynamoDB"></a>

DynamoDB では、クラシック API または [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 互換のクエリ言語) を使用して、単一の項目を変更できます。複数の項目を変更する場合は、複数のオペレーションを使用する必要があります。

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

DynamoDB API では、`UpdateItem` オペレーションを使用して、単一の項目を変更します。

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

属性値を指定するには、変更する項目の `Key` 属性および `UpdateExpression` を指定する必要があります。`UpdateItem` は、「アップサート」オペレーションのように動作します。テーブルに項目が存在する場合は更新され、存在しない場合は新しい項目が追加 (挿入) されます。

`UpdateItem` は、*条件付き書き込み*をサポートしており、特定の `ConditionExpression` が true と評価された場合のみ、オペレーションが成功します。たとえば、次の `UpdateItem` オペレーションは、曲の価格が 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` は*アトミックカウンター*、または増加減少する `Number` 型の属性をサポートしています。アトミックカウンターは多くの点で SQL データベースのシーケンスジェネレーター、IDENTITY 列、または自動インクリメントフィールドと似ています。

`UpdateItem` オペレーションを使用して、新しい属性 (*Plays*) を初期化し、曲の再生回数を追跡する例を次に示します。

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

`ReturnValues` パラメータは、更新された任意の属性の新しい値を返す、`UPDATED_NEW` に設定されています。この場合は、0 (ゼロ) を返します。

ユーザーがこの曲を再生するたびに、次の `UpdateItem` オペレーションを使用して *Plays* を 1 ずつ増分できます。

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

PartiQL では、`Update` ステートメントを利用する `ExecuteStatement` オペレーションを使用して、テーブル内の項目を変更します。

このテーブルのプライマリキーは、*Artist* および *SongTitle* で構成されます。これらの属性の値を指定する必要があります。

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

また、次の例のように、複数のフィールドを一度に変更することもできます。

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

また、`Update` は*アトミックカウンター*、または増加減少する `Number` 型の属性をサポートしています。アトミックカウンターは多くの点で SQL データベースのシーケンスジェネレーター、IDENTITY 列、または自動インクリメントフィールドと似ています。

次は、曲が再生された回数を追跡するための新しい属性 (*Plays*) を初期化する `Update` ステートメントの例です。

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

ユーザーがこの曲を再生するたびに、次の `Update` ステートメントを使用して *Plays* を 1 ずつ増分できます。

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

**注記**  
`Update` と `ExecuteStatement` を使用したコード例については、[DynamoDB 用の PartiQL 更新ステートメント](ql-reference.update.md) を参照してください。

------