

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon Keyspaces 中建立使用者定義類型 (UDT)
<a name="keyspaces-create-udt"></a>

若要在單一區域金鑰空間中建立 UDT，您可以在 CQL、 `create-type`命令與 AWS CLI或 主控台中使用 `CREATE TYPE`陳述式。

UDT 名稱不得超過 48 個字元、開頭必須是英文字母字元，且只能包含英數字元和底線。Amazon Keyspaces 會自動將大寫字元轉換成小寫字元。

或者，您可以使用雙引號宣告 UDT 名稱。在 UDT 名稱前後加上雙引號來宣告名稱時，Amazon Keyspaces 會保留大寫並允許特殊字元。

您也可以在建立 UDT 時使用雙引號作為名稱的一部分，但必須使用額外的雙引號字元來逸出每個雙引號字元。

下表顯示允許的 UDT 名稱範例。第一欄顯示如何在建立類型時輸入名稱，第二欄顯示 Amazon Keyspace 如何在內部格式化名稱。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 會從格式化名稱中移除最外層的雙引號及逸出雙引號。 | 

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

**使用 Amazon Keyspaces 主控台建立使用者定義類型 (UDT)**

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/keyspaces/home](https://console.aws.amazon.com/keyspaces/home) 開啟 Amazon Keyspaces 主控台。

1. 在導覽窗格中，選擇**金鑰空間**，然後從清單中選擇金鑰空間。

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"
   }
   ```

------