

# 关系（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` 操作来将*播放次数*增加 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 `ExecuteStatement` 语句来使用 `Update` 操作修改表中的项目。

此表的主键包含 *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` 的代码示例，请参阅 [PartiQL for DynamoDB Update 语句](ql-reference.update.md)。

------