

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

# 在 Amazon Keyspaces 中创建用户定义类型 (UDT)
<a name="keyspaces-create-udt"></a>

要在单区域密钥空间中创建 UDT，可以使用 CQL 中的`CREATE TYPE`语句、带的`create-type` AWS CLI命令或控制台。

UDT 名称必须包含不超过 48 个字符，必须以字母字符开头，并且只能包含字母数字字符和下划线。Amazon Keyspaces 会自动将大写字符转换为小写字符。

或者，可以在双引号中声明 UDT 名称。在双引号内声明 UDT 名称时，Amazon Keyspaces 保留大写字母并支持使用特殊字符。

创建 UDT 时，也可以使用双引号作为名称的一部分，但必须使用额外的双引号字符对每个双引号字符进行转义。

下表显示了支持的 UDT 名称的示例。第一列显示在创建类型时如何输入名称，第二列显示 Amazon Keyspaces 如何在内部设置名称格式。Amazon Keyspaces 希望对操作使用诸如 `GetType` 之类的格式化名称。


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

------
#### [ Console ]

**使用 Amazon Keyspaces 控制台创建用户定义类型 (UDT)**

1. [登录并在家中打开 Amazon Keyspaces 控制台。 AWS 管理控制台 https://console.aws.amazon.com/keyspaces/](https://console.aws.amazon.com/keyspaces/home)

1. 在导航窗格中，选择 **Keyspaces**，然后从列表中选择一个密钥空间。

1. 选择 **UDTs** 选项卡。

1. 选择 “**创建 UDT**”

1. 在 **UDT 详细信息**下，输入 UDT 的名称。在 **UDT 字段**下，您可以定义 UDT 的架构。

1. 要完成操作，请选择 “**创建 UDT**”。

------
#### [ Cassandra Query Language (CQL) ]

**使用 CQL 创建用户定义类型 (UDT)**

在此示例中，我们创建了中使用的图书奖励表的新版本[在 Amazon Keyspaces 中创建表](getting-started.tables.md)。在此表中，我们存储了作者因某本书而获得的所有奖项。我们创建了两个嵌套 UDTs 的书籍，其中包含有关获得奖项的图书的信息。

1. 使用名称`catalog`创建密钥空间。

   ```
   CREATE KEYSPACE catalog WITH REPLICATION = {'class': 'SingleRegionStrategy'};
   ```

1. 创建第一个类型。这种类型存储 *BISAC* 代码，这些代码用于定义书籍的类型。BISAC 代码由字母数字代码和最多四个主题区域组成。

   ```
   CREATE TYPE catalog.bisac (
       bisac_code text,
       subject1 text,
       subject2 text,
       subject3 text,
       subject4 text
   );
   ```

1. 使用第一个 UDT 为图书奖励创建第二种类型。必须冻结嵌套的 UDT。

   ```
   CREATE TYPE catalog.book (
       award_title text,
       book_title text,
       publication_date date,
       page_count int,
       ISBN text,
       genre FROZEN <bisac> 
   );
   ```

1. 创建一个包含作者姓名列的表格，并使用列表类型作为图书奖项。请注意，必须冻结列表中使用的 UDT。

   ```
   CREATE TABLE catalog.authors (
       author_name text PRIMARY KEY,
       awards list <FROZEN <book>>
   );
   ```

1. 在此步骤中，我们在新表中插入一行数据。

   ```
   CONSISTENCY LOCAL_QUORUM;
   ```

   ```
   INSERT INTO catalog.authors (author_name, awards) VALUES (
   'John Stiles' , 
   [{
         award_title: 'Wolf',
         book_title: 'Yesterday',
         publication_date: '2020-10-10',
         page_count: 345,
         ISBN: '026204630X',
         genre: { bisac_code:'FIC014090', subject1: 'FICTION', subject2: 'Historical', subject3: '20th Century', subject4: 'Post-World War II'}
         },
         {award_title: 'Richard Roe',
         book_title: 'Who ate the cake?',
         publication_date: '2019-05-13',
         page_count: 193,
         ISBN: '9780262046305',
         genre: { bisac_code:'FIC022130', subject1: 'FICTION', subject2: 'Mystery & Detective', subject3: 'Cozy', subject4: 'Culinary'}
         }]
   );
   ```

1. 在最后一步中，我们从表中读取数据。

   ```
   SELECT * FROM catalog.authors;
   ```

   命令的输出应如下所示。

   ```
    author_name | awards
   -------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    John Stiles | [{award_title: 'Wolf', book_title: 'Yesterday', publication_date: 2020-10-10, page_count: 345, isbn: '026204630X', genre: {bisac_code: 'FIC014090', subject1: 'FICTION', subject2: 'Historical', subject3: '20th Century', subject4: 'Post-World War II'}}, {award_title: 'Richard Roe', book_title: 'Who ate the cake?', publication_date: 2019-05-13, page_count: 193, isbn: '9780262046305', genre: {bisac_code: 'FIC022130', subject1: 'FICTION', subject2: 'Mystery & Detective', subject3: 'Cozy', subject4: 'Culinary'}}]
   
   (1 rows)
   ```

   有关 CQL 语法的更多信息，请参阅 [CREATE TYPE](cql.ddl.type.md#cql.ddl.type.create)。

------
#### [ CLI ]

**使用创建用户定义类型 (UDT) AWS CLI**

1. 要创建类型，可以使用以下语法。

   ```
   aws keyspaces create-type
   --keyspace-name 'my_keyspace'
   --type-name 'my_udt'
   --field-definitions
       '[
           {"name" : "field1", "type" : "int"},
           {"name" : "field2", "type" : "text"}
       ]'
   ```

1. 该命令的输出与本示例类似。请注意，`typeName`返回 UDT 的格式化名称。

   ```
   {
       "keyspaceArn": "arn:aws:cassandra:us-east-1:111122223333:/keyspace/my_keyspace/",
       "typeName": "my_udt"
   }
   ```

------