

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 修改資料表資料時，關聯式 (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` 陳述式修改一或多列。`SET` 子句可為一或多個資料行指定新的值，`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 中，您可以使用 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` 的運作方式類似「upsert」操作。如果項目存在資料表中，則會進行更新，如果不存在，則會新增 (插入) 新項目。

`UpdateItem` 支援*條件式寫入*，即只有在特定 `ConditionExpression` 評估為 true 時，操作才會成功。例如，若歌曲的價格未大於或等於 2.00，下列 `UpdateItem` 操作就不會執行更新。

```
{
    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 資料庫中的順序產生器、身分欄位或自動遞增欄位在許多方面都非常類似。

下列是 `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，您可以使用 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 資料庫中的順序產生器、身分欄位或自動遞增欄位在許多方面都非常類似。

以下為 `Update` 陳述式的示例，用以初始化新的屬性 (*Plays*) 來追蹤歌曲的播放次數。

```
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 Update 陳述式](ql-reference.update.md)。

------