

# 针对 DynamoDB 表的基本操作
<a name="WorkingWithTables.Basics"></a>

类似于其他数据库系统，Amazon DynamoDB 将数据存储在表中。您可以使用一些基本操作来管理表。

**Topics**
+ [

## 创建表
](#WorkingWithTables.Basics.CreateTable)
+ [

## 描述表
](#WorkingWithTables.Basics.DescribeTable)
+ [

## 更新表
](#WorkingWithTables.Basics.UpdateTable)
+ [

## 删除表
](#WorkingWithTables.Basics.DeleteTable)
+ [

## 使用删除保护
](#WorkingWithTables.Basics.DeletionProtection)
+ [

## 列出表名
](#WorkingWithTables.Basics.ListTables)
+ [

## 描述预调配的吞吐量配额
](#WorkingWithTables.Basics.DescribeLimits)

## 创建表
<a name="WorkingWithTables.Basics.CreateTable"></a>

使用 `CreateTable` 操作在 Amazon DynamoDB 中创建表。要创建表，您必须提供以下信息：
+ **表名 **() 此名称必须遵循 DynamoDB 命名规则，并且对当前 AWS 账户和区域必须唯一。例如，您可以创建 `People` 表中的美国东部（弗吉尼亚州北部）和另一个 `People` 表在欧洲地区（爱尔兰）。但是，这两个表彼此完全不同。有关更多信息，请参阅 [Amazon DynamoDB 中支持的数据类型和命名规则](HowItWorks.NamingRulesDataTypes.md)。
+ **主键。**主键可包含一个属性（分区键）或两个属性（分区键和排序键）。您需要提供每个属性的属性名称、数据类型和角色：`HASH`（针对分区键）和 `RANGE`（针对排序键）。有关更多信息，请参阅 [主键](HowItWorks.CoreComponents.md#HowItWorks.CoreComponents.PrimaryKey)。
+ **吞吐量设置（对于预置表）。**如果使用预置模式，则必须指定表的初始读取和写入吞吐量设置。您可以稍后修改这些设置，或启用 DynamoDB Auto Scaling 以管理设置。有关更多信息，请参阅[DynamoDB 预置容量模式](provisioned-capacity-mode.md)和[使用 DynamoDB Auto Scaling 自动管理吞吐能力](AutoScaling.md)。

### 示例 1：创建按需表
<a name="create-payperrequest-example"></a>

使用按需模式创建同一个表 `Music`。

```
aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode=PAY_PER_REQUEST
```

`CreateTable` 操作返回表的元数据，如下所示。

```
{
    "TableDescription": {
        "TableArn": "arn:aws:dynamodb:us-east-1:123456789012:table/Music",
        "AttributeDefinitions": [
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "WriteCapacityUnits": 0,
            "ReadCapacityUnits": 0
        },
        "TableSizeBytes": 0,
        "TableName": "Music",
        "BillingModeSummary": {
            "BillingMode": "PAY_PER_REQUEST"
        },
        "TableStatus": "CREATING",
        "TableId": "12345678-0123-4567-a123-abcdefghijkl",
        "KeySchema": [
            {
                "KeyType": "HASH",
                "AttributeName": "Artist"
            },
            {
                "KeyType": "RANGE",
                "AttributeName": "SongTitle"
            }
        ],
        "ItemCount": 0,
        "CreationDateTime": 1542397468.348
    }
}
```

**重要**  
 当对按需表调用 `DescribeTable` 时，读取容量单位和写入容量单位设置为 0。

### 示例 2：创建预置表
<a name="create-provisioned-example"></a>

以下 AWS CLI 示例说明了如何创建表 (`Music`)。主键包含 `Artist`（分区键）和 `SongTitle`（排序键），它们均具有 `String` 数据类型。此表的最大吞吐量为 10 个读取容量单位和 5 个写入容量单位。

```
aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5
```

`CreateTable` 操作返回表的元数据，如下所示。

```
{
    "TableDescription": {
        "TableArn": "arn:aws:dynamodb:us-east-1:123456789012:table/Music",
        "AttributeDefinitions": [
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "WriteCapacityUnits": 5,
            "ReadCapacityUnits": 10
        },
        "TableSizeBytes": 0,
        "TableName": "Music",
        "TableStatus": "CREATING",
        "TableId": "12345678-0123-4567-a123-abcdefghijkl",
        "KeySchema": [
            {
                "KeyType": "HASH",
                "AttributeName": "Artist"
            },
            {
                "KeyType": "RANGE",
                "AttributeName": "SongTitle"
            }
        ],
        "ItemCount": 0,
        "CreationDateTime": 1542397215.37
    }
}
```

这些区域有：`TableStatus` 元素指示表的当前状态 (`CREATING`)。创建表可能需要一段时间，具体取决于您为 `ReadCapacityUnits` 和 `WriteCapacityUnits` 指定的值。二者的值越大，DynamoDB 需要为表分配的资源就越多。

### 示例 3：使用“DynamoDB 标准 – 不频繁访问”表类别创建表
<a name="create-infrequent-access-example"></a>

要使用“DynamoDB 标准-不经常访问”表类别创建相同的 `Music` 表。

```
aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --table-class STANDARD_INFREQUENT_ACCESS
```

`CreateTable` 操作返回表的元数据，如下所示。

```
{
    "TableDescription": {
        "TableArn": "arn:aws:dynamodb:us-east-1:123456789012:table/Music",
        "AttributeDefinitions": [
            {
                "AttributeName": "Artist",
                "AttributeType": "S"
            },
            {
                "AttributeName": "SongTitle",
                "AttributeType": "S"
            }
        ],
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "WriteCapacityUnits": 5,
            "ReadCapacityUnits": 10
        },
        "TableClassSummary": {
            "LastUpdateDateTime": 1542397215.37,
            "TableClass": "STANDARD_INFREQUENT_ACCESS"
        },
        "TableSizeBytes": 0,
        "TableName": "Music",
        "TableStatus": "CREATING",
        "TableId": "12345678-0123-4567-a123-abcdefghijkl",
        "KeySchema": [
            {
                "KeyType": "HASH",
                "AttributeName": "Artist"
            },
            {
                "KeyType": "RANGE",
                "AttributeName": "SongTitle"
            }
        ],
        "ItemCount": 0,
        "CreationDateTime": 1542397215.37
    }
}
```

## 描述表
<a name="WorkingWithTables.Basics.DescribeTable"></a>

要查看有关表的详细信息，请使用 `DescribeTable` 操作。您必须提供表名称。`DescribeTable` 的输出格式与 `CreateTable` 相同。它包括表创建时的时间戳、表的键架构、预配置吞吐量设置、表的估计大小以及存在的所有二级索引。

**重要**  
 当对按需表调用 `DescribeTable` 时，读取容量单位和写入容量单位设置为 0。

**Example**  

```
aws dynamodb describe-table --table-name Music
```

当 `TableStatus` 从 `CREATING` 更改为 `ACTIVE` 后，表即可供使用。

**注意**  
如果发出 `CreateTable` 请求后立即请求 `DescribeTable`，DynamoDB 可能会返回一个错误 (`ResourceNotFoundException`)。这是因为 `DescribeTable` 使用最终一致查询，并且表的元数据在此时可能不可用。请等待几秒钟，再尝试 `DescribeTable` 请求。  
出于记账目的，您的 DynamoDB 存储成本包含 100 字节的每项目开销。（有关更多信息，请转到 [DynamoDB 定价](https://aws.amazon.com/dynamodb/pricing/)。） 每项目的此额外 100 字节不会用于容量单位计算或用于 `DescribeTable` 操作。

## 更新表
<a name="WorkingWithTables.Basics.UpdateTable"></a>

利用 `UpdateTable` 操作，您可以执行下列操作之一：
+ 修改表的预置吞吐量设置（对于预置模式表）。
+ 更改表的读/写容量模式。
+ 在表上操作全局二级索引（请参阅 [在 DynamoDB 中使用全局二级索引](GSI.md)）。
+ 在表上启用或禁用 DynamoDB Streams（请参阅 [将更改数据捕获用于 DynamoDB Streams](Streams.md)）。

**Example**  
下面的 AWS CLI 示例说明如何修改表的预置吞吐量设置。  

```
aws dynamodb update-table --table-name Music \
    --provisioned-throughput ReadCapacityUnits=20,WriteCapacityUnits=10
```

**注意**  
在发出 `UpdateTable` 请求时，表的状态从 `AVAILABLE` 变为 `UPDATING`。该表仍然完全可用，而它是 `UPDATING`。完成此过程后，表状态将从 `UPDATING` 到 `AVAILABLE`。

**Example**  
下面的 AWS CLI 示例说明如何将表的读/写容量模式修改为按需模式。  

```
aws dynamodb update-table --table-name Music \
    --billing-mode PAY_PER_REQUEST
```

## 删除表
<a name="WorkingWithTables.Basics.DeleteTable"></a>

您可以通过 `DeleteTable` 操作移除未使用的表格。表的删除操作是不可恢复的。要使用 AWS 管理控制台删除表，请参阅[第 6 步：（可选）删除 DynamoDB 表以清理资源](getting-started-step-6.md)。

**Example**  
下面的 AWS CLI 示例说明如何删除表。  

```
aws dynamodb delete-table --table-name Music
```

在您发出 `DeleteTable` 请求时，表的状态从 `ACTIVE` 变为 `DELETING`。删除表可能需要一段时间，具体取决于它使用的资源（例如表中存储的数据以及表上的任何流或索引）。

在 `DeleteTable` 操作结束时，该表在 DynamoDB 中不再存在。

## 使用删除保护
<a name="WorkingWithTables.Basics.DeletionProtection"></a>

您可以使用删除保护属性保护表免遭意外删除。为表启用此属性有助于确保在管理员执行常规表管理操作期间不会意外删除表。这将有助于防止您的常规业务运营受到干扰。

 表所有者或授权管理员控制每个表的删除保护属性。默认情况下，每个表的删除保护属性为关闭状态。这包括全局副本和从备份中恢复的表。禁用表的删除保护后，任何获得 Identity and Access Management (IAM) 策略授权的用户都可以删除该表。当表启用了删除保护时，任何人都无法将其删除。

要更改此设置，请转到表的**其他设置**，导航到**删除保护**面板，然后选择**启用删除保护**。

DynamoDB 控制台、API、CLI/SDK 和 CloudFormation 都支持删除保护属性。`CreateTable` API 在创建表时支持删除保护属性，并且 `UpdateTable` API 支持更改现有表的删除保护属性。

**注意**  
如果删除了某个 AWS 账户，则该账户的所有数据（包括表）仍会在 90 天内被删除。
如果 DynamoDB 无法访问用于加密表的客户托管密钥，DynamoDB 仍将存档此表。存档包括备份表和删除原始表。

## 列出表名
<a name="WorkingWithTables.Basics.ListTables"></a>

`ListTables` 操作返回当前 AWS 账户和区域的 DynamoDB 表的名称。

**Example**  
下面的 AWS CLI 示例演示如何列出 DynamoDB 表名称。  

```
aws dynamodb list-tables
```

## 描述预调配的吞吐量配额
<a name="WorkingWithTables.Basics.DescribeLimits"></a>

`DescribeLimits` 操作会返回当前 AWS 账户和区域的当前读入容量配额。

**Example**  
下面的 AWS CLI 示例说明了如何描述当前的预置吞吐量配额。  

```
aws dynamodb describe-limits
```
输出显示当前 AWS 账户和区域的读入容量单位配额。

有关这些配额以及如何请求增加配额的更多信息，请参阅 [吞吐量默认限额](ServiceQuotas.md#default-limits-throughput)。