

# 关系（SQL）数据库和 DynamoDB 在向表写入数据方面的差异
<a name="SQLtoNoSQL.WriteData"></a>

关系数据库表包含数据*行*。行由*列*组成。Amazon DynamoDB 表包含*项目*。项目由*属性* 组成。

本节介绍如何将一行（或一个项目）写入表。

**Topics**
+ [使用 SQL 将数据写入表](#SQLtoNoSQL.WriteData.SQL)
+ [在 DynamoDB 中将数据写入表](#SQLtoNoSQL.WriteData.DynamoDB)

## 使用 SQL 将数据写入表
<a name="SQLtoNoSQL.WriteData.SQL"></a>

关系数据库中的表是一个由行和列组成的二维数据结构。一些数据库管理系统还支持半结构化数据（通常包括原生 JSON 或 XML 数据类型）。但实施详情因供应商而异。

在 SQL 中，您将使用 `INSERT` 语句向表添加行。

```
INSERT INTO Music
    (Artist, SongTitle, AlbumTitle,
    Year, Price, Genre,
    Tags)
VALUES(
    'No One You Know', 'Call Me Today', 'Somewhat Famous',
    2015, 2.14, 'Country',
    '{"Composers": ["Smith", "Jones", "Davis"],"LengthInSeconds": 214}'
);
```

此表的主键包含 *Artist* 和 *SongTitle*。您必须为这些列指定值。

**注意**  
该示例使用 *Tags* 列存储有关 *Music* 表中歌曲的半结构化数据。*Tags* 列定义为类型 TEXT，可在 MySQL 中存储最多 65535 个字符。

## 在 DynamoDB 中将数据写入表
<a name="SQLtoNoSQL.WriteData.DynamoDB"></a>

在 Amazon DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html)（一种与 SQL 兼容的查询语言）将项目添加到表中。

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

使用 DynamoDB API，您可以使用 `PutItem` 操作向表添加项目。

```
{
    TableName: "Music",
    Item: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today",
        "AlbumTitle":"Somewhat Famous",
        "Year": 2015,
        "Price": 2.14,
        "Genre": "Country",
        "Tags": {
            "Composers": [
                  "Smith",
                  "Jones",
                  "Davis"
            ],
            "LengthInSeconds": 214
        }
    }
}
```

此表的主键包含 *Artist* 和 *SongTitle*。您必须为这些属性指定值。

以下是要了解的有关此 `PutItem` 示例的几个关键事项：
+ DynamoDB 使用 JSON 提供对文档的原生支持。这使得 DynamoDB 非常适合存储半结构化数据，例如*标记*。您也可以从 JSON 文档中检索和操作数据。
+ 除了主键（*Artist* 和 *SongTitle*）外，*Music* 表没有任何预定义属性。
+ 大多数 SQL 数据库是面向事务的。当您发出 `INSERT` 语句时，数据修改不是永久性的，直至您发出 `COMMIT` 语句。利用 Amazon DynamoDB，当 DynamoDB 回复 HTTP 200 状态代码（`OK`）时，`PutItem` 操作的效果是永久性的。

以下是其他几个 `PutItem` 示例。

```
{
    TableName: "Music",
    Item: {
        "Artist": "No One You Know",
        "SongTitle": "My Dog Spot",
        "AlbumTitle":"Hey Now",
        "Price": 1.98,
        "Genre": "Country",
        "CriticRating": 8.4
    }
}
```

```
{
    TableName: "Music",
    Item: {
        "Artist": "No One You Know",
        "SongTitle": "Somewhere Down The Road",
        "AlbumTitle":"Somewhat Famous",
        "Genre": "Country",
        "CriticRating": 8.4,
        "Year": 1984
    }
}
```

```
{
    TableName: "Music",
    Item: {
        "Artist": "The Acme Band",
        "SongTitle": "Still In Love",
        "AlbumTitle":"The Buck Starts Here",
        "Price": 2.47,
        "Genre": "Rock",
        "PromotionInfo": {
            "RadioStationsPlaying":[
                 "KHCR", "KBQX", "WTNR", "WJJH"
            ],
            "TourDates": {
                "Seattle": "20150625",
                "Cleveland": "20150630"
            },
            "Rotation": "Heavy"
        }
    }
}
```

```
{
    TableName: "Music",
    Item: {
        "Artist": "The Acme Band",
        "SongTitle": "Look Out, World",
        "AlbumTitle":"The Buck Starts Here",
        "Price": 0.99,
        "Genre": "Rock"
    }
}
```

**注意**  
除了 `PutItem` 之外，DynamoDB 还支持使用 `BatchWriteItem` 操作同时写入多个项目。

------
#### [ PartiQL for DynamoDB ]

使用 PartiQL，您可以通过使用 PartiQL `Insert` 语句来使用 `ExecuteStatement` 操作向表添加项目。

```
INSERT into Music value {  
    'Artist': 'No One You Know',
    'SongTitle': 'Call Me Today',
    'AlbumTitle': 'Somewhat Famous',
    'Year' : '2015',
    'Genre' : 'Acme'
}
```

此表的主键包含 *Artist* 和 *SongTitle*。您必须为这些属性指定值。

**注意**  
有关使用 `Insert` 和 `ExecuteStatement` 的代码示例，请参阅 [PartiQL for DynamoDB Insert 语句](ql-reference.insert.md)。

------