

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon Keyspaces 中的 DDL 语句（数据定义语言）
<a name="cql.ddl"></a>

*数据定义语言* (DDL) 是一组用于管理 Amazon Keyspaces（Apache Cassandra 兼容）中的数据结构（如键空间和表）的 Cassandra 查询语言 (CQL) 语句。可以使用 DDL 创建这些数据结构，在创建数据结构后对其进行修改，以及在不再使用数据结构时将其删除。Amazon Keyspaces 以异步方式执行 DDL 操作。有关如何确认异步操作已完成的更多信息，请参阅[异步创建与删除键空间和表](functional-differences.md#functional-differences.table-keyspace-management)。

 支持以下 DDL 语句：
+  [CREATE KEYSPACE](cql.ddl.keyspace.md#cql.ddl.keyspace.create) 
+  [ALTER KEYSPACE](cql.ddl.keyspace.md#cql.ddl.keyspace.alter) 
+  [DROP KEYSPACE](cql.ddl.keyspace.md#cql.ddl.keyspace.drop) 
+  [使用](cql.ddl.keyspace.md#cql.ddl.keyspace.use) 
+  [CREATE TABLE](cql.ddl.table.md#cql.ddl.table.create) 
+  [ALTER TABLE](cql.ddl.table.md#cql.ddl.table.alter) 
+  [RESTORE TABLE](cql.ddl.table.md#cql.ddl.table.restore) 
+  [DROP TABLE](cql.ddl.table.md#cql.ddl.table.drop) 
+  [创建类型](cql.ddl.type.md#cql.ddl.type.create) 
+  [掉落类型](cql.ddl.type.md#cql.ddl.type.drop) 

**Topics**
+ [Keyspaces](cql.ddl.keyspace.md)
+ [表](cql.ddl.table.md)
+ [用户定义的类型 (UDTs)](cql.ddl.type.md)

# Keyspaces
<a name="cql.ddl.keyspace"></a>

*键空间* 对与一个或多个应用程序相关的表进行分组。就关系数据库管理系统 (RDBMS) 而言，键空间与数据库、表空间或类似的结构大致相似。

**注意**  
在 Apache Cassandra 中，键空间将决定如何在多个存储节点之间复制数据。但是，Amazon Keyspaces 是一项完全托管式服务：系统将为您管理其存储层的详细信息。因此，Amazon Keyspaces 中的键空间只是逻辑结构，并且与底层物理存储无关。

有关 Amazon Keyspaces 键空间的配额限制和约束的信息，请参阅 [Amazon Keyspaces（Apache Cassandra 兼容）限额](quotas.md)。

**Topics**
+ [CREATE KEYSPACE](#cql.ddl.keyspace.create)
+ [ALTER KEYSPACE](#cql.ddl.keyspace.alter)
+ [DROP KEYSPACE](#cql.ddl.keyspace.drop)
+ [USE](#cql.ddl.keyspace.use)

## CREATE KEYSPACE
<a name="cql.ddl.keyspace.create"></a>

使用 `CREATE KEYSPACE` 语句可创建新的键空间。

**语法**

```
create_keyspace_statement ::= 
    CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name
    WITH options
```

其中：
+ `keyspace_name` 是要创建的键空间的名称。
+ *选项* 为下列一个或多个项：
  + `REPLICATION`：表示键空间复制策略的映射：
    + `SingleRegionStrategy`：用于单区域键空间。（必需）
    + `NetworkTopologyStrategy`— 指定至少两个 AWS 区域。每个区域的复制因子为 3。（可选）
  + `DURABLE_WRITES`：由于对 Amazon Keyspaces 的写入操作始终是持久的，因此此选项不是必需的。但是，如果指定此选项，则值必须为 `true`。
  + `TAGS`：创建资源时要附加到资源的键值对标签的列表。（可选）

**示例**

创建键空间，如下所示。

```
CREATE KEYSPACE my_keyspace
    WITH REPLICATION = {'class': 'SingleRegionStrategy'} and TAGS ={'key1':'val1', 'key2':'val2'} ;
```

要创建多区域密钥空间，请指定`NetworkTopologyStrategy`并包含至少两个密钥空间。 AWS 区域每个区域的复制因子为 3。

```
CREATE KEYSPACE my_keyspace
    WITH REPLICATION = {'class':'NetworkTopologyStrategy', 'us-east-1':'3', 'ap-southeast-1':'3','eu-west-1':'3'};
```

## ALTER KEYSPACE
<a name="cql.ddl.keyspace.alter"></a>

您可以将该`ALTER KEYSPACE WITH`语句用于以下*选项*
+ `REPLICATION`— 使用此选项向密钥空间添加新的 AWS 区域 副本。您可以向单区域或多区域密钥空间添加新区域。
+ `TAGS`— 使用此选项在密钥空间中添加或删除标签。

**语法**

```
alter_keyspace_statement ::= 
    ALTER KEYSPACE keyspace_name
    WITH options
```

其中：
+ `keyspace_name` 是要更改的键空间的名称。
+ *选项*是以下选项之一：
  + `ADD | DROP TAGS`：要在键空间中添加或删除的键值对标签的列表。
  + `REPLICATION`— 表示密钥空间复制策略的地图；
    + `class`— `NetworkTopologyStrategy` 将密钥空间定义为多区域密钥空间。
    + `region`— AWS 区域 为此密钥空间再指定一个。每个区域的复制因子为 3。
    + `CLIENT_SIDE_TIMESTAMPS`— 默认值为`DISABLED`。您只能将状态更改为`ENABLED`。

**示例**

如以下示例所示更改密钥空间以添加标签。

```
ALTER KEYSPACE my_keyspace ADD TAGS {'key1':'val1', 'key2':'val2'};
```

要向多区域密钥空间添加第三个区域，可以使用以下语句。

```
ALTER KEYSPACE my_keyspace
WITH REPLICATION = {
    'class': 'NetworkTopologyStrategy',
    'us-east-1': '3',
    'us-west-2': '3',
    'us-west-1': '3'
} AND CLIENT_SIDE_TIMESTAMPS = {'status': 'ENABLED'};
```

## DROP KEYSPACE
<a name="cql.ddl.keyspace.drop"></a>

使用 `DROP KEYSPACE` 语句可删除键空间，包括其所有内容（如表）。

**语法**

```
drop_keyspace_statement ::= 
    DROP KEYSPACE [ IF EXISTS ] keyspace_name
```

其中：
+ *keyspace\$1name* 是要删除的键空间的名称。

**示例**

```
DROP KEYSPACE my_keyspace;
```

## USE
<a name="cql.ddl.keyspace.use"></a>

使用`USE`语句定义当前的密钥空间。这允许您引用绑定到特定密钥空间的对象，例如表和类型，而不必使用包含键空间前缀的完全限定名称。

**语法**

```
use_statement ::= 
    USE keyspace_name
```

其中：
+ *keyspace\$1nam* e 是要使用的密钥空间的名称。

**示例**

```
USE my_keyspace;
```

# 表
<a name="cql.ddl.table"></a>

*表*是 Amazon Keyspaces 中的主要数据结构。表中的数据按行和列进行组织。这些列的子集用于通过指定分区键来确定分区（以及最终的数据放置）。

可以将另一组列定义为聚类列，这意味着它们可以作为谓词参与查询执行。

默认情况下，将创建具有*按需* 吞吐容量的新表。您可以更改新表和现有表的容量模式。有关 read/write 容量吞吐模式的更多信息，请参阅[在 Amazon Keyspaces 中配置 read/write 容量模式](ReadWriteCapacityMode.md)。

对于处于预置模式的表，您可以配置可选 `AUTOSCALING_SETTINGS`。有关 Amazon Keyspaces 自动扩缩及可用选项的更多信息，请参阅[在现有表上配置自动扩缩](autoscaling.configureTable.md)。

有关 Amazon Keyspaces 表的配额限制和约束的信息，请参阅 [Amazon Keyspaces（Apache Cassandra 兼容）限额](quotas.md)。

**Topics**
+ [CREATE TABLE](#cql.ddl.table.create)
+ [ALTER TABLE](#cql.ddl.table.alter)
+ [RESTORE TABLE](#cql.ddl.table.restore)
+ [DROP TABLE](#cql.ddl.table.drop)

## CREATE TABLE
<a name="cql.ddl.table.create"></a>

使用 `CREATE TABLE` 语句可创建新表。

 **语法**

```
create_table_statement ::=  CREATE TABLE [ IF NOT EXISTS ] table_name
    '('
        column_definition 
        ( ',' column_definition )*
        [ ',' PRIMARY KEY '(' primary_key ')' ]
    ')' [ WITH table_options ]

column_definition      ::=  column_name cql_type [ FROZEN ][ STATIC ][ PRIMARY KEY]

primary_key            ::=  partition_key [ ',' clustering_columns ]

partition_key          ::=  column_name
                              | '(' column_name ( ',' column_name )* ')'

clustering_columns     ::=  column_name ( ',' column_name )*

table_options          ::=  [table_options]
                              | CLUSTERING ORDER BY '(' clustering_order ')' [ AND table_options ]
                              | cdc
                              | CUSTOM_PROPERTIES
                              | AUTOSCALING_SETTINGS
                              | default_time_to_live
                              | TAGS

clustering_order       ::=  column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*
```

其中：
+ `table_name` 是要创建的表的名称。完全限定名称包括密钥空间前缀。或者，也可以使用 keyspace 语句设置当前的`USE`密钥空间。
+ `column_definition` 包含以下各项：
  +  *`column_name`*：列的名称。
  + `cql_type`：一种 Amazon Keyspaces 数据类型（参见[数据类型](cql.elements.md#cql.data-types)）。
  + `FROZEN`— 将用户定义的列或类型`collection`（例如`LIST``SET`、或`MAP`）的列指定为已冻结。*冻结*集合将被序列化为单个不可变值，并被视为 `BLOB`。有关更多信息，请参阅 [集合类型](cql.elements.md#cql.data-types.collection)。
  + `STATIC`：将此列指定为静态。静态列存储由同一分区中的所有行共享的值。
  + `PRIMARY KEY`：将此列指定为表的主键。
+ `primary_key` 包含以下各项：
  + `partition_key`
  + `clustering_columns`
+ `partition_key`:
  + 分区键可以是单个列，也可以是由两列或多个列组成的复合值。主键的分区键部分是必需的，它决定了 Amazon Keyspaces 存储数据的方式。
+ `clustering_columns`:
  + 主键的可选聚类列部分决定如何在每个分区中聚类和排序数据。
+ `table_options` 包含以下各项：
  + *`CLUSTERING ORDER BY`*：表上的默认 CLUSTERING ORDER 包含 `ASC`（升序）排序方向的聚类键。指定它可覆盖默认排序行为。
  +  *`cdc`*— 一个布尔值，用于指定 Amazon Keyspaces 是否为表创建更改数据捕获 (CDC) 流。默认值为 `false`。要在启用直播`view type`时指定，请将设置`cdc_specification`为`CUSTOM_PROPERTIES`。
  +  *`CUSTOM_PROPERTIES`*：特定于 Amazon Keyspaces 的设置的映射。
    +  `capacity_mode`：指定表的读/写吞吐容量模式。选项为 `throughput_mode:PAY_PER_REQUEST` 和 `throughput_mode:PROVISIONED`。预置容量模式要求将 `read_capacity_units` 和 `write_capacity_units` 作为输入。默认值为 `throughput_mode:PAY_PER_REQUEST`。
    +  `cdc_specification`：指定 `view_type` CDC 直播的。选项包括：
      + `NEW_AND_OLD_IMAGES`— 该行的两个版本，在更改之前和之后。这是默认值。
      + `NEW_IMAGE`— 更改后的行的版本。
      + `OLD_IMAGE`— 更改前行的版本。
      + `KEYS_ONLY`— 已更改行的分区和群集键。

      有关 CDC 直播的更多信息，请参阅[在 Amazon Keyspaces 中处理变更数据捕获 (CDC) 流](cdc.md)。有关代码示例，请参阅 [在 Amazon Keyspaces 中创建新表时启用 CDC 流](keyspaces-enable-cdc-new-table.md)。
    +  `client_side_timestamps`：指定为表启用还是禁用客户端时间戳。选项为 `{'status': 'enabled'}` 和 `{'status': 'disabled'}`。如果未指定，则默认为 `status:disabled`。为表启用客户端时间戳后便无法禁用该设置。
    +  `encryption_specification`：为静态加密指定加密选项。如果未指定，则默认为 `encryption_type:AWS_OWNED_KMS_KEY`。加密选项客户托管密钥要求输入 Amazon 资源名称 (ARN) 格式的 AWS KMS 密钥作为输入:: `kms_key_identifier:ARN`。`kms_key_identifier:ARN`
    +  `point_in_time_recovery`：指定是启用还是禁用表的 point-in-time还原。选项为 `status:enabled` 和 `status:disabled`。如果未指定，则默认为 `status:disabled`。
    + `replica_updates`：指定特定于 AWS 区域的多区域表设置。对于多区域表，您可以按 AWS 区域以不同的方式配置表的读取容量。您可以通过配置以下参数完成该操作。有关更多信息以及示例，请参阅 [在 Amazon Keyspaces 中使用自动扩缩功能在预置模式下创建多区域表](tables-mrr-create-provisioned.md)。
      + `region`— 具有以下设置 AWS 区域 的表副本的：
        + `read_capacity_units`
    +  `TTL`：为表启用存活时间自定义设置。要启用，请使用 `status:enabled`。默认值为 `status:disabled`。为表启用 `TTL` 后便无法禁用该设置。
  + `AUTOSCALING_SETTINGS` 包括预置模式下表的以下可选设置。有关更多信息以及示例，请参阅 [创建启用了自动扩缩的新表](autoscaling.createTable.md)。
    + `provisioned_write_capacity_autoscaling_update`:
      + `autoscaling_disabled` - 要为写入容量启用自动扩缩，请将该值设置为 `false`。默认值为 `true`。（可选）
      + `minimum_units` - 表应始终支持的最小写入吞吐量水平。该值必须介于 1 和账户的每秒最大吞吐量配额（默认为 40000）之间。
      + `maximum_units` - 表应始终支持的最大写入吞吐量水平。该值必须介于 1 和账户的每秒最大吞吐量配额（默认为 40000）之间。
      + `scaling_policy` - Amazon Keyspaces 支持目标跟踪策略。自动扩缩目标是表的预置写入容量。
        + `target_tracking_scaling_policy_configuration` - 要定义目标跟踪策略，必须定义目标值。有关目标跟踪和冷却时间的更多信息，请参阅《Application Auto Scaling 用户指南》中的 [Target Tracking Scaling Policies](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html)。
          + `target_value` - 表的目标利用率。Amazon Keyspaces 自动扩缩可确保消耗的容量与预置容量的比例保持在该值或接近该值。您将 `target_value` 定义为百分比。20 到 90 之间的双精度值。（必需）
          + `scale_in_cooldown` – 扩缩活动之间的冷却时间（以秒为单位），可让表在另一个横向缩减活动开始之前稳定下来。如果未提供值，则默认值为 0。（可选）
          + `scale_out_cooldown` – 扩缩活动之间的冷却时间（以秒为单位），可让表在另一个横向扩展活动开始之前稳定下来。如果未提供值，则默认值为 0。（可选）
          + `disable_scale_in`：一个 `boolean`，指定是否为该表禁用或启用 `scale-in`。默认情况下，将禁用此参数。要开启 `scale-in`，请将 `boolean` 值设置为 `FALSE`。这表示会代表您自动缩减表的容量。（可选） 
    + `provisioned_read_capacity_autoscaling_update`:
      + `autoscaling_disabled` - 要为读取容量启用自动扩缩，请将该值设置为 `false`。默认值为 `true`。（可选）
      + `minimum_units` - 表应始终支持的最小吞吐量水平。该值必须介于 1 和账户的每秒最大吞吐量配额（默认为 40000）之间。
      + `maximum_units` - 表应始终支持的最大吞吐量水平。该值必须介于 1 和账户的每秒最大吞吐量配额（默认为 40000）之间。
      + `scaling_policy` - Amazon Keyspaces 支持目标跟踪策略。自动扩缩目标是表的预置读取容量。
        + `target_tracking_scaling_policy_configuration` - 要定义目标跟踪策略，必须定义目标值。有关目标跟踪和冷却时间的更多信息，请参阅《Application Auto Scaling 用户指南》中的 [Target Tracking Scaling Policies](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html)。
          + `target_value` - 表的目标利用率。Amazon Keyspaces 自动扩缩可确保消耗的容量与预置容量的比例保持在该值或接近该值。您将 `target_value` 定义为百分比。20 到 90 之间的双精度值。（必需）
          + `scale_in_cooldown` – 扩缩活动之间的冷却时间（以秒为单位），可让表在另一个横向缩减活动开始之前稳定下来。如果未提供值，则默认值为 0。（可选）
          + `scale_out_cooldown` – 扩缩活动之间的冷却时间（以秒为单位），可让表在另一个横向扩展活动开始之前稳定下来。如果未提供值，则默认值为 0。（可选）
          + `disable_scale_in`：一个 `boolean`，指定是否为该表禁用或启用 `scale-in`。默认情况下，将禁用此参数。要开启 `scale-in`，请将 `boolean` 值设置为 `FALSE`。这表示会代表您自动缩减表的容量。（可选） 
    + `replica_updates`：指定多区域表的 AWS 区域 特定自动缩放设置。对于多区域表，您可以按 AWS 区域以不同的方式配置表的读取容量。您可以通过配置以下参数完成该操作。有关更多信息以及示例，请参阅 [在 Amazon Keyspaces 中更新多区域表的预置容量和自动扩缩设置](tables-mrr-autoscaling.md)。
      + `region`— 具有以下设置 AWS 区域 的表副本的：
        + `provisioned_read_capacity_autoscaling_update`
          + `autoscaling_disabled` - 要为表的读取容量启用自动扩缩，请将该值设置为 `false`。默认值为 `true`。（可选） 
**注意**  
必须为该表的所有副本启用或禁用多区域表的自动扩缩。
          + `minimum_units` - 表应始终支持的最小读取吞吐量水平。该值必须介于 1 和账户的每秒最大吞吐量配额（默认为 40000）之间。
          + `maximum_units` - 表应始终支持的最大读取吞吐量水平。该值必须介于 1 和账户的每秒最大吞吐量配额（默认为 40000）之间。
          + `scaling_policy` - Amazon Keyspaces 支持目标跟踪策略。自动扩缩目标是表的预置读取容量。
            + `target_tracking_scaling_policy_configuration` - 要定义目标跟踪策略，必须定义目标值。有关目标跟踪和冷却时间的更多信息，请参阅《Application Auto Scaling 用户指南》中的 [Target Tracking Scaling Policies](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-target-tracking.html)。
              + `target_value` - 表的目标利用率。Amazon Keyspaces 自动扩缩可确保使用的读取容量与预置读取容量的比例保持在该值或接近该值。您将 `target_value` 定义为百分比。20 到 90 之间的双精度值。（必需）
              + `scale_in_cooldown` – 扩缩活动之间的冷却时间（以秒为单位），可让表在另一个横向缩减活动开始之前稳定下来。如果未提供值，则默认值为 0。（可选）
              + `scale_out_cooldown` – 扩缩活动之间的冷却时间（以秒为单位），可让表在另一个横向扩展活动开始之前稳定下来。如果未提供值，则默认值为 0。（可选）
              + `disable_scale_in`：一个 `boolean`，指定是否为该表禁用或启用 `scale-in`。默认情况下，将禁用此参数。要开启 `scale-in`，请将 `boolean` 值设置为 `FALSE`。这表示会代表您自动缩减表的读取容量。（可选） 
  + `default_time_to_live`：表的默认存活时间设置（以秒为单位）。
  + `TAGS`：创建资源时要附加到资源的键值对标签的列表。
  + `clustering_order` 包含以下各项：
    +  *`column_name`*：列的名称。
    +  *`ASC | DESC`*：设置升序 (`ASC`) 或降序 (`DESC`) 顺序修饰符。如果未指定，则默认顺序为 ASC。

**示例**

```
CREATE TABLE IF NOT EXISTS my_keyspace.my_table (
                                            id text,
                                            name text,
                                            region text,
                                            division text,
                                            project text,
                                            role text,
                                            pay_scale int,
                                            vacation_hrs float,
                                            manager_id text,
                                            PRIMARY KEY (id,division))
                                            WITH CUSTOM_PROPERTIES={
                                                'capacity_mode':{
                                                        'throughput_mode': 'PROVISIONED', 'read_capacity_units': 10, 'write_capacity_units': 20
                                                    },
                                                'point_in_time_recovery':{'status': 'enabled'},
                                                'encryption_specification':{
                                                        'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 
                                                        'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111'
                                                    }
                                            }
                                            AND CLUSTERING ORDER BY (division ASC) 
                                            AND TAGS={'key1':'val1', 'key2':'val2'}
                                            AND default_time_to_live = 3024000;
```

在使用聚类列的表中，可以在表定义中将非聚类列声明为静态列。有关静态列的更多信息，请参阅 [估算 Amazon Keyspaces 中静态列的容量消耗](static-columns.md)。

**示例**

```
CREATE TABLE my_keyspace.my_table (
                                            id int,
                                            name text,
                                            region text,
                                            division text,
                                            project text STATIC,
                                            PRIMARY KEY (id,division));
```

您可以创建包含使用用户定义类型 (UDT) 的列的表。示例中的第一条语句创建类型，第二条语句创建包含使用该类型的列的表。

**示例**

```
CREATE TYPE my_keyspace."udt""N@ME" (my_field int);
CREATE TABLE my_keyspace.my_table (my_col1 int pri key, my_col2 "udt""N@ME");
```

## ALTER TABLE
<a name="cql.ddl.table.alter"></a>

使用 `ALTER TABLE` 语句可添加新列、添加标签或更改表的自定义属性。

**语法**

```
alter_table_statement ::=  ALTER TABLE table_name    
 
        [ ADD ( column_definition | column_definition_list)  ] 
        [[ADD | DROP] TAGS {'key1':'val1', 'key2':'val2'}]            
        [ WITH table_options [ , ... ] ] ;
        
column_definition      ::=  column_name cql_type
```

其中：
+ `table_name` 是要更改的表的名称。
+ `column_definition` 是要添加的列和数据类型的名称。
+ `column_definition_list` 是放在括号内的列的逗号分隔列表。
+ `table_options` 包含以下各项：
  + `AUTOSCALING_SETTINGS` 包括预置表的可选自动扩缩设置。有关语法和详细说明，请参阅 [CREATE TABLE](#cql.ddl.table.create)。有关示例，请参阅 [在现有表上配置自动扩缩](autoscaling.configureTable.md)。
  +  *`cdc`*— 一个布尔值，用于指定 Amazon Keyspaces 是否为表创建更改数据捕获 (CDC) 流。默认值为 `false`。要在启用直播`view type`时指定，请将设置`cdc_specification`为`CUSTOM_PROPERTIES`。
  +  *`CUSTOM_PROPERTIES`*：特定于 Amazon Keyspaces 的设置的映射。
    +  `capacity_mode`：指定表的读/写吞吐容量模式。选项为 `throughput_mode:PAY_PER_REQUEST` 和 `throughput_mode:PROVISIONED`。预置容量模式要求将 `read_capacity_units` 和 `write_capacity_units` 作为输入。默认值为 `throughput_mode:PAY_PER_REQUEST`。
    +  `cdc_specification`：指定 `view_type` CDC 直播的。选项包括：
      + `NEW_AND_OLD_IMAGES`— 该行的两个版本，在更改之前和之后。这是默认值。
      + `NEW_IMAGE`— 更改后的行的版本。
      + `OLD_IMAGE`— 更改前行的版本。
      + `KEYS_ONLY`— 已更改行的分区和群集键。

      有关 CDC 直播的更多信息，请参阅[在 Amazon Keyspaces 中处理变更数据捕获 (CDC) 流](cdc.md)。有关代码示例，请参阅 [为 Amazon Keyspaces 中的现有表启用 CDC 流](keyspaces-enable-cdc-alter-table.md)。
    +  `client_side_timestamps`：指定为表启用还是禁用客户端时间戳。选项为 `{'status': 'enabled'}` 和 `{'status': 'disabled'}`。如果未指定，则默认为 `status:disabled`。为表启用客户端时间戳后便无法禁用该设置。
    +  `encryption_specification`：为静态加密指定加密选项。选项为 `encryption_type:AWS_OWNED_KMS_KEY` 和 `encryption_type:CUSTOMER_MANAGED_KMS_KEY`。加密选项客户自主管理型密钥要求输入 Amazon 资源名称 (ARN) 格式的 AWS KMS 密钥作为输入：`kms_key_identifier:ARN`。
    +  `point_in_time_recovery`：指定是启用还是禁用表的 point-in-time还原。选项为 `status:enabled` 和 `status:disabled`。默认值为 `status:disabled`。
    + `replica_updates`：指定多区域表的 AWS 区域 特定设置。对于多区域表，您可以按 AWS 区域以不同的方式配置表的读取容量。您可以通过配置以下参数完成该操作。有关更多信息以及示例，请参阅 [在 Amazon Keyspaces 中更新多区域表的预置容量和自动扩缩设置](tables-mrr-autoscaling.md)。
      + `region`— 具有以下设置 AWS 区域 的表副本的：
        + `read_capacity_units` 
    +  `ttl`：为表启用存活时间自定义设置。要启用，请使用 `status:enabled`。默认值为 `status:disabled`。为表启用 `ttl` 后便无法禁用该设置。
+ `default_time_to_live`：表的默认存活时间设置（以秒为单位）。
+ `TAGS` 是要附加到资源的键/值对标签的列表。

**注意**  
使用 ALTER TABLE 时，您只能更改单个自定义属性。您无法在同一语句中组合多个 ALTER TABLE 命令。

**示例**

以下语句展示如何将列添加到现有表。

```
ALTER TABLE mykeyspace.mytable ADD (ID int);
```

此语句展示如何将两个集合列添加到现有表：
+ 包含嵌套冻结集合的冻结集合列 `col_frozen_list`
+ 包含嵌套冻结集合的非冻结集合列 `col_map`

```
ALTER TABLE my_Table ADD(col_frozen_list FROZEN<LIST<FROZEN<SET<TEXT>>>>, col_map MAP<INT, FROZEN<SET<INT>>>);
```

以下示例说明如何向表中添加使用用户定义类型 (UDT) 的列。

```
ALTER TABLE my_keyspace.my_table ADD (my_column, my_udt;);
```

要更改表的容量模式并指定读取和写入容量单位，可以使用以下语句。

```
ALTER TABLE mykeyspace.mytable WITH CUSTOM_PROPERTIES={'capacity_mode':{'throughput_mode': 'PROVISIONED', 'read_capacity_units': 10, 'write_capacity_units': 20}};
```

以下语句为表指定客户自主管理型 KMS 密钥。

```
ALTER TABLE mykeyspace.mytable WITH CUSTOM_PROPERTIES={     
              'encryption_specification':{ 
                      'encryption_type': 'CUSTOMER_MANAGED_KMS_KEY', 
                      'kms_key_identifier':'arn:aws:kms:eu-west-1:5555555555555:key/11111111-1111-111-1111-111111111111'     
                  } 
         };
```

要为表启用 point-in-time还原，可以使用以下语句。

```
ALTER TABLE mykeyspace.mytable WITH CUSTOM_PROPERTIES={'point_in_time_recovery': {'status': 'enabled'}};
```

要为表设置默认存活时间值（以秒为单位），可以使用以下语句。

```
ALTER TABLE my_table WITH default_time_to_live = 2592000;
```

此语句为表启用自定义存活时间设置。

```
ALTER TABLE mytable WITH CUSTOM_PROPERTIES={'ttl':{'status': 'enabled'}};
```

## RESTORE TABLE
<a name="cql.ddl.table.restore"></a>

使用 `RESTORE TABLE` 语句可将表恢复到某个时间点。此语句要求在表上启用 point-in-time恢复。有关更多信息，请参阅 [使用 Amazon Keyspaces 的 point-in-time恢复功能备份和还原数据](PointInTimeRecovery.md)。

**语法**

```
restore_table_statement ::=  
    RESTORE TABLE restored_table_name FROM TABLE source_table_name 
                    [ WITH table_options [ , ... ] ];
```

其中：
+ `restored_table_name` 是已恢复的表的名称。
+ `source_table_name` 是源表的名称。
+ `table_options` 包含以下各项：
  + `restore_timestamp` 是 ISO 8601 格式的恢复点时间。如果未指定，则使用当前时间戳。
  +  *`CUSTOM_PROPERTIES`*：特定于 Amazon Keyspaces 的设置的映射。
    +  `capacity_mode`：指定表的读/写吞吐容量模式。选项为 `throughput_mode:PAY_PER_REQUEST` 和 `throughput_mode:PROVISIONED`。预置容量模式要求将 `read_capacity_units` 和 `write_capacity_units` 作为输入。默认值为源表中的当前设置。
    +  `encryption_specification`：为静态加密指定加密选项。选项为 `encryption_type:AWS_OWNED_KMS_KEY` 和 `encryption_type:CUSTOMER_MANAGED_KMS_KEY`。加密选项客户托管密钥要求输入亚马逊资源名称 (ARN) 格式的 AWS KMS 密钥作为输入：。`kms_key_identifier:ARN`要将使用客户托管密钥加密的表恢复到使用加密的表 AWS 拥有的密钥，Amazon Keyspaces 需要访问源表的 AWS KMS 密钥。
    +  `point_in_time_recovery`：指定是启用还是禁用表的 point-in-time还原。选项为 `status:enabled` 和 `status:disabled`。与创建新表时不同，已恢复的表的默认状态为 `status:enabled`，因为该设置继承自源表。要对已恢复的表禁用 PITR，必须显式设置 `status:disabled`。
    + `replica_updates`：指定多区域表的 AWS 区域 特定设置。对于多区域表，您可以按 AWS 区域以不同的方式配置表的读取容量。您可以通过配置以下参数完成该操作。
      + `region`— 具有以下设置 AWS 区域 的表副本的：
        + `read_capacity_units` 
  + `AUTOSCALING_SETTINGS` 包括预置表的可选自动扩缩设置。有关详细语法和说明，请参阅 [CREATE TABLE](#cql.ddl.table.create)。
  + `TAGS` 是要附加到资源的键/值对标签的列表。

**注意**  
已删除的表只能恢复到删除时的状态。

**示例**

```
RESTORE TABLE mykeyspace.mytable_restored from table mykeyspace.my_table 
WITH restore_timestamp = '2020-06-30T04:05:00+0000'
AND custom_properties = {'point_in_time_recovery':{'status':'disabled'}, 'capacity_mode':{'throughput_mode': 'PROVISIONED', 'read_capacity_units': 10, 'write_capacity_units': 20}}
AND TAGS={'key1':'val1', 'key2':'val2'};
```

## DROP TABLE
<a name="cql.ddl.table.drop"></a>

使用 `DROP TABLE` 语句可从键空间中删除表。

**语法**

```
drop_table_statement ::=  
    DROP TABLE [ IF EXISTS ] table_name
```

其中：
+ `IF EXISTS` 防止 `DROP TABLE` 在表不存在的情况下失败。（可选）
+ `table_name` 是要删除的表的名称。

**示例**

```
DROP TABLE my_keyspace.my_table;
```

# 用户定义的类型 (UDTs)
<a name="cql.ddl.type"></a>

*UDT* — 一组字段和数据类型，可用于在 Amazon Keyspaces 中定义单个列。的有效数据类型 UDTs 是所有支持的 Cassandra 数据类型，包括集合和你 UDTs 已经在同一个密钥空间中创建的其他数据类型。有关支持的 Cassandra 数据类型的更多信息，请参阅[Cassandra 数据类型支持](cassandra-apis.md#cassandra-data-type)。

```
user_defined_type::= udt_name
udt_name::= [ keyspace_name '.' ] identifier
```

**Topics**
+ [CREATE TYPE](#cql.ddl.type.create)
+ [DROP TYPE](#cql.ddl.type.drop)

## CREATE TYPE
<a name="cql.ddl.type.create"></a>

使用`CREATE TYPE`语句创建新类型。

 **语法**

```
create_type_statement ::=  CREATE TYPE [ IF NOT EXISTS ] udt_name
    '('field_definition ( ',' field_definition)* ')'
            field_definition::= identifier cql_type
```

其中：
+ `IF NOT EXISTS`如果该类型已经存在，则可以`CREATE TYPE`防止失败。（可选）
+ `udt_name`例如，是类型格式的 UDT 的完全限定名称。`my_keyspace.my_type`如果使用`USE`语句定义当前的密钥空间，则无需指定密钥空间名称。
+ `field_definition`由名称和类型组成。

下表显示了允许的 UDT 名称的示例。第一列显示了在创建类型时如何输入名称，第二列显示了 Amazon Keyspaces 如何在内部设置名称的格式。Amazon Keyspaces 要求这样的操作使用格式化的名称。`GetType`


| 输入的名字 | 格式化名称 | 备注 | 
| --- | --- | --- | 
|  MY\$1UDT  | my\$1udt | 如果不使用双引号，Amazon Keyspaces 会将所有大写字符转换为小写字母。 | 
|  "MY\$1UDT"  | MY\$1UDT | 使用双引号时，Amazon Keyspaces 会尊重大写字符，并从格式化的名称中删除双引号。 | 
|  "1234"  | 1234 | 使用双引号时，名称可以以数字开头，Amazon Keyspaces 会从格式化的名称中删除双引号。 | 
|  "Special\$1Ch@r@cters<>\$1\$1"  | Special\$1Ch@r@cters<>\$1\$1 | 使用双引号时，名称可以包含特殊字符，Amazon Keyspaces 会从格式化的名称中删除双引号。 | 
|  "nested""""""quotes"  | nested"""quotes | Amazon Keyspaces 会从格式化名称中删除外部双引号和转义双引号。 | 

**示例**

```
CREATE TYPE my_keyspace.phone (
    country_code int,
    number text
);
```

 UDTs 如果嵌套的 UDT 已冻结，则可以嵌套。有关类型的默认值和配额的更多信息，请参阅[Amazon Keyspaces UDT 配额和默认值](quotas.md#udt-table)。

```
CREATE TYPE my_keyspace.user (
    first_name text,
    last_name text,
    phones FROZEN<phone>
);
```

有关展示如何创建的更多代码示例 UDTs，请参阅[Amazon Keys UDTs paces 中的用户定义类型 ()](udts.md)。

## DROP TYPE
<a name="cql.ddl.type.drop"></a>

使用`DROP TYPE`语句删除 UDT。您只能删除其他类型或表未使用的类型。

 **语法**

```
drop_type_statement ::=  DROP TYPE [ IF EXISTS ] udt_name
```

其中：
+ `IF EXISTS``DROP TYPE`防止在类型不存在时失败。（可选）
+ `udt_name`例如，是类型格式的 UDT 的完全限定名称。`my_keyspace.my_type`如果使用`USE`语句定义当前的密钥空间，则无需指定密钥空间名称。

**示例**

```
DROP TYPE udt_name;
```