

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# CREATE TABLE
CREATE TABLE

在目前資料庫中建立新的資料表。您可以定義資料欄清單，每個資料欄都會保留不同類型的資料。資料表的擁有者是 CREATE TABLE 命令的發行者。

## 所需權限
所需權限

以下是 CREATE TABLE 所需的權限：
+ 超級使用者
+ 具有 CREATE TABLE 權限的使用者

## 語法
語法

```
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ] TABLE
[ IF NOT EXISTS ] table_name
( { column_name data_type [column_attributes] [ column_constraints ]
  | table_constraints
  | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
  [, ... ]  )
[ BACKUP { YES | NO } ]
[table_attributes]

where column_attributes are:
  [ DEFAULT default_expr ]
  [ IDENTITY ( seed, step ) ]
  [ GENERATED BY DEFAULT AS IDENTITY ( seed, step ) ]
  [ ENCODE encoding ]
  [ DISTKEY ]
  [ SORTKEY ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]

and column_constraints are:
  [ { NOT NULL | NULL } ]
  [ { UNIQUE  |  PRIMARY KEY } ]
  [ REFERENCES reftable [ ( refcolumn ) ] ]

and table_constraints  are:
  [ UNIQUE ( column_name [, ... ] ) ]
  [ PRIMARY KEY ( column_name [, ... ] )  ]
  [ FOREIGN KEY (column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]


and table_attributes are:
  [ DISTSTYLE { AUTO | EVEN | KEY | ALL } ]
  [ DISTKEY ( column_name ) ]
  [ [COMPOUND | INTERLEAVED ] SORTKEY ( column_name [,...]) |  [ SORTKEY AUTO ] ]
  [ ENCODE AUTO ]
```

## Parameters
Parameters

LOCAL   
選用。雖然陳述式中可接受此關鍵字，但是在 Amazon Redshift 中沒有作用。

TEMPORARY \$1 TEMP   
建立臨時資料表的關鍵字，只能在目前工作階段中看見。資料表會在建立所在的工作階段結束時自動捨棄。臨時資料表可與永久資料表同名。臨時資料表是以不同的工作階段專屬結構描述建立 (您無法指定此結構描述的名稱)。此臨時結構描述會成為搜尋路徑中的第一個結構描述，因此，除非您以結構描述名稱限定資料表名稱來存取永久資料表，否則臨時資料表的優先順序高於永久資料表。如需結構描述和優先順序的相關資訊，請參閱 [search\$1path](r_search_path.md)。  
根據預設，資料庫使用者依其 PUBLIC 群組中的自動成員資格，具有建立臨時資料表的許可。若要拒絕使用者的此權限，請撤銷 PUBLIC 群組的 TEMP 權限，然後明確將 TEMP 權限僅授予特定使用者或使用者群組。

IF NOT EXISTS  
此子句會指出，若指定的資料表已存在，則命令不應進行任何變更，且應傳回資料表存在的訊息，而不是在發生錯誤的情況下停止。請注意，現有資料表可能與這裡建立的資料表完全不一樣；只有資料表名稱進行比較。  
此子句在編寫指令碼時很實用，如此指令碼就不會因為 CREATE TABLE 嘗試建立已存在的資料表而失敗。

 *table\$1name*   
要建立的資料表名稱。  
若您指定 '\$1' 開頭的資料表名稱，所建立的資料表會是臨時資料表。以下是範例：  

```
create table #newtable (id int);
```
您也可以使用 '\$1 '參考資料表。例如：  

```
select * from #newtable;
```
資料表名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。Amazon Redshift 會依節點類型強制執行每個叢集的資料表數目配額限制，包括使用者定義的臨時資料表，以及 Amazon Redshift 在查詢處理或系統維護期間建立的臨時資料表。或者，資料表名稱也可透過資料庫和結構描述名稱來限定。在以下範例中，資料庫名稱為 `tickit`，結構描述名稱為 `public`，而資料表名稱為 `test`。  

```
create table tickit.public.test (c1 int);
```
如果資料庫或結構描述不存在，則不會建立資料表，而且陳述式會傳回錯誤。您無法在系統資料庫 `template0`、`template1`、`padb_harvest` 或 `sys:internal` 中建立資料表或視觀表。  
若提供結構描述名稱，則會在該結構描述中建立新資料表 (假設建立者具有存取結構描述的權限)。資料表名稱對於該結構描述來說必須是唯一的。如果未指定結構描述，則會使用目前資料庫結構描述建立資料表。如果您要建立臨時資料表，就不能指定結構描述名稱，因為臨時資料表會採用特殊結構描述。  
若臨時資料表是在不同的工作階段中建立的話，在同一個資料庫中可同時有多個同名的臨時資料表存在，因為資料表會指派至不同的結構描述。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

 *column\$1name*   
要在新資料表中建立的資料欄名稱。資料欄名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。單一資料表中可定義的資料欄數目上限為 1,600 個。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
若您要建立「寬資料表」，則務必注意，在載入和查詢處理期間，您的資料欄清單未超過中繼結果的資料列寬度界限。如需詳細資訊，請參閱[使用須知](#r_CREATE_TABLE_usage)。

 *data\$1type*   
要建立之資料欄的資料類型。若是 CHAR 和 VARCHAR 資料欄，您可以改用 MAX 關鍵字，而不宣告長度上限。MAX 會將 CHAR 的長度上限設定為 4,096 個位元組，或將 VARCHAR 的長度上限設定為 65535 個位元組。GEOMETRY 物件的大小上限是 1,048,447 位元組。  
如需有關 Amazon Redshift 支援資料類型的資訊，請參閱 [資料類型](c_Supported_data_types.md)。

DEFAULT *default\$1expr*   <a name="create-table-default"></a>
此子句會指派資料欄的預設資料值。*default\$1expr* 的資料類型必須符合資料欄的資料類型。DEFAULT 值必須是無變數的表達式。不允許子查詢、目前資料表中其他資料欄的交叉參考，以及使用者定義的功能。  
*default\$1expr* 表達式是在未指定資料欄值的任何 INSERT 操作中使用。若未指定預設值，則資料欄的預設值為 null。  
若在既定資料欄清單上進行的 COPY 操作省略有 DEFAULT 值的資料欄，則 COPY 命令會插入 *default\$1expr* 的值。

IDENTITY(*seed*, *step*)   <a name="identity-clause"></a>
此子句會指出資料欄是 IDENTITY 資料欄。IDENTITY 資料欄包含唯一的自動產生值。IDENTITY 資料欄的資料類型必須是 INT 或 BIGINT。  
當您使用 `INSERT` 或 `INSERT INTO [tablename] VALUES()` 陳述式新增資料列時，這些值會從指定為 *seed* 的值開始，並依指定為 *step* 的數字遞增。  
使用 `INSERT INTO [tablename] SELECT * FROM` 或 `COPY` 陳述式載入資料表時，會並行載入資料並將其分發至節點片段。為確保身分值是唯一的，Amazon Redshift 會在建立身分值時略過一些值。身分值是唯一的，但順序可能不符合來源檔案中的順序。

GENERATED BY DEFAULT AS IDENTITY(*seed*, *step*)   <a name="identity-generated-bydefault-clause"></a>
指定資料欄是預設 IDENTITY 資料欄的子句，其可讓您自動將唯一值指派給資料欄。IDENTITY 資料欄的資料類型必須是 INT 或 BIGINT。當您新增沒有值的資料列時，這些值會從指定為 *seed* 的值開始，並依指定為 *step* 的數字遞增。如需如何產生值的詳細資訊，請參閱[IDENTITY](#identity-clause)。  
此外，在 INSERT、UPDATE 或 COPY 期間，您可以提供沒有 EXCLIIT\$1IDS 的值。Amazon Redshift 會使用該值插入身分資料欄，而不是使用系統產生的值。此值可以是複本、小於種子的值，或是介於步驟值之間的值。Amazon Redshift 不會檢查資料欄中的值是否是唯一的。提供一值並不會影響下一個系統產生的值。  
如果您需要資料欄中的唯一性，請不要新增複本值。改為新增小於種子或介於步驟值之間的唯一值。
請記住下列有關預設身分資料欄的事項：  
+ 預設身分資料欄為 NOT NULL。無法插入 NULL。
+ 若要將產生的值插入至預設身分資料欄，請使用關鍵字 `DEFAULT`。

  ```
  INSERT INTO tablename (identity-column-name) VALUES (DEFAULT);
  ```
+ 置換預設身分資料欄的值並不會影響下一個產生的值。
+ 您無法利用 ALTER TABLE ADD COLUMN 陳述式來新增預設身分資料欄。
+ 您可以利用 ALTER TABLE APPEND 陳述式來附加預設身分資料欄。

ENCODE *encoding*   
資料欄的壓縮編碼。ENCODE AUTO 是資料表的預設值。Amazon Redshift 會自動管理資料表中所有資料欄的壓縮編碼。如果您為資料表中的任何資料欄指定壓縮編碼，資料表就不會再設定為 ENCODE AUTO。Amazon Redshift 不再自動管理資料表中所有資料欄的壓縮編碼。您可以為資料表指定 ENCODE AUTO 選項，讓 Amazon Redshift 自動管理資料表中所有資料欄的壓縮編碼。  
  
Amazon Redshift 會自動將初始壓縮編碼指派給您未指定壓縮編碼的資料欄，如下所示：  
+ 暫時資料表中的所有資料欄預設都會有指派的 RAW 壓縮。
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL、DOUBLE PRECISION、GEOMETRY 或 GEOGRAPHY 資料類型的資料行會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR、VARCHAR 或 VARBYTE 的資料欄會有指派的 LZO 壓縮。
若您不想要壓縮資料欄，請明確指定 RAW 編碼。
 支援以下 [compression encodings](c_Compression_encodings.md#compression-encoding-list)：  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (無壓縮)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD

DISTKEY  
此關鍵字會指定資料欄是資料表的分佈索引鍵。資料表中只能有一個資料欄是分佈索引鍵。您可以在資料欄名稱後面使用 DISTKEY 關鍵字，或使用 DISTKEY (*column\$1name*) 語法使其成為資料表定義的一部分。兩種方法的效果一樣。如需詳細資訊，請參閱本主題稍後的 DISTSTYLE 參數。  
分佈索引鍵資料欄的資料類型可以是：BOOLEAN、REAL、DOUBLE PRECISION、SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ、CHAR 或 VARCHAR。

SORTKEY  
此關鍵字會指定資料欄是資料表的排序索引鍵。當資料載入資料表時，資料會依指定為排序索引鍵的一個或多個資料欄排序。您可以在資料欄名稱後面使用 SORTKEY 關鍵字指定單欄排序索引鍵，或使用 SORTKEY (*column\$1name* [, ...]) 語法指定一個或多個資料欄做為資料表的排序索引鍵資料欄。此語法只會建立複合排序索引鍵。  
您最多可為每個資料表定義 400 個 SORTKEY 資料欄。  
排序索引鍵資料欄的資料類型可以是：BOOLEAN、REAL、DOUBLE PRECISION、SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ、CHAR 或 VARCHAR。

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
指定資料欄上的字串搜尋或比較是區分大小寫或不區分大小寫的子句。預設值與資料庫目前的區分大小寫設定相同。  
僅字串型資料類型支援 COLLATE，包括 CHAR、VARCHAR 和 SUPER 資料欄中的字串值。如需不區分大小寫的 SUPER 資料查詢詳細資訊，請參閱 [不區分大小寫的查詢](query-super.md#case-insensitive-super-queries)。  
若要尋找資料庫定序資訊，請使用下列命令：  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE 和 CS 可互換，並產生相同的結果。同樣地，CASE\$1INSENSITIVE 和 CI 可互換，並產生相同的結果。

NOT NULL \$1 NULL   
NOT NULL 會指定不允許資料欄包含 null 值。NULL 是預設值，指出資料欄可接受 null 值。IDENTITY 資料欄預設會宣告為 NOT NULL。

UNIQUE  
此關鍵字會指定資料欄只能包含唯一值。唯一資料表限制條件的行為與資料欄限制條件的行為相同，但多了可橫跨多個資料欄的額外功能。若要定義唯一資料表限制條件，請使用 UNIQUE (*column\$1name* [, ... ]) 語法。  
唯一限制條件僅供參考，系統不會強制執行它們。

PRIMARY KEY  
此關鍵字會指定資料欄是資料表的主索引鍵。只能使用資料欄定義將一個資料欄定義為主索引鍵。若要定義具有多資料欄主索引鍵的資料表限制條件，請使用 PRIMARY KEY (*column\$1name* [, ... ]) 語法。  
將資料欄識別為主索引鍵即可提供有關結構描述設計的中繼資料。主索引鍵表示，其他資料表可倚賴這組資料欄做為資料列的唯一識別碼。一個資料表中可指定一個主索引鍵，無論是資料欄限制條件或資料表限制條件都可行。主索引鍵限制條件應命名一組資料欄，這組資料欄有別於由為相同資料表所定義的任何唯一限制條件命名的其他資料欄組。  
主索引鍵也會定義為 NOT NULL。  
主索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

References *reftable* [ ( *refcolumn* ) ]  
此子句會指定外部索引鍵限制條件，表示資料欄包含的值只能是符合參考資料表中某一資料列之參考資料欄的值。參考資料欄應為參考資料表中唯一或主索引鍵限制條件的資料欄。  
 外部索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

LIKE *parent\$1table* [ \$1 INCLUDING \$1 EXCLUDING \$1 DEFAULTS ]   <a name="create-table-like"></a>
此子句會指定現有資料表，新資料表會自動從該資料表複製資料欄名稱、資料類型及 NOT NULL 限制條件。新資料表和父資料表是分開的，對父資料表所做的變更不會套用至新資料表。複製資料欄定義的預設表達式只會在指定了 INCLUDING DEFAULTS 時複製。預設行為是執行預設表達式，如此一來，新資料表中所有資料欄的預設值都是 null。  
使用 LIKE 選項建立的資料表不會繼承主索引鍵和外部索引鍵限制條件。LIKE 資料表會繼承分佈樣式、排序索引鍵、BACKUP 及 NULL 屬性，但您無法明確設定這些屬性在 CREATE TABLE ... LIKE 陳述式。

BACKUP \$1 YES \$1 NO \$1   <a name="create-table-backup"></a>
此子句會指定資料表是否應包含在自動化和手動叢集快照中。  
若是像臨時資料表這類不會包含重要資料的資料表，指定 BACKUP NO 可以在建立快照以及從快照還原時節省處理時間，並減少 Amazon Simple Storage Service 上的儲存空間。BACKUP NO 設定對於將資料自動複寫到叢集內其他節點的操作並無影響，因此指定了 BACKUP NO 的資料表會在節點發生故障時還原。預設值為 BACKUP YES。  
RA3 佈建叢集和 Amazon Redshift Serverless 工作群組不支援無備份資料表。在 RA3 叢集或無伺服器工作群組中標記為無備份的資料表會視為永久資料表，且在拍攝快照時一律會備份，並一律在從快照還原時還原。為了避免無備份資料表的快照成本，請在拍攝快照之前截斷這些資料表。

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
定義整個資料表的資料分佈樣式的關鍵字。Amazon Redshift 會根據資料表上指定的分佈樣式，將資料表的資料列分散到運算節點。預設值為 AUTO。  
您為資料表選取的分佈樣式會影響資料庫的整體效能。如需詳細資訊，請參閱[分配資料以實現查詢最佳化](t_Distributing_data.md)。可能的分佈樣式如下：  
+ AUTO：Amazon Redshift 會根據資料表資料來指派最佳分佈樣式。例如，如果指定 AUTO 分佈樣式，Amazon Redshift 一開始會將 ALL 分佈樣式指派給小型資料表。當資料表變大時，Amazon Redshift 可能會將分佈樣式變更為 KEY，並選擇主索引鍵 (或複合主鍵的資料欄) 作為 DISTKEY。如果資料表變大，並且沒有任何資料欄適合作為 DISTKEY，則 Amazon Redshift 會將分佈樣式變更為 EVEN。分佈樣式的變更會發生在背景中，對使用者查詢的影響最小。

  若要檢視套用至資料表的分佈樣式，請查詢 PG\$1CLASS 系統目錄資料表。如需詳細資訊，請參閱[檢視分佈樣式](viewing-distribution-styles.md)。
+ EVEN：資料表中的資料會採循環分佈的方式，均勻分配到叢集中的各個節點。資料列 ID 會用來決定分佈，並且將大致相同的資料列數分佈到每個節點。
+ KEY：資料是依 DISTKEY 資料欄中的值分佈。當您將聯結資料表的聯結資料欄設定為分佈索引鍵時，兩個資料表的聯結資料列會在運算節點上並存。資料並存時，最佳化工具就能更有效率地執行聯結。若您指定 DISTSTYLE KEY，則必須命名 DISTKEY 資料欄，無論是資料表或做為資料欄定義的一部分皆可。如需詳細資訊，請參閱本主題前段的 DISTKEY 參數。
+  ALL：整個資料表的副本分佈至每個節點。此分佈樣式可確保每個節點上都有任何聯結所需的所有資料列，但儲存空間的需求也會倍增，並且會增加資料表的負載和維護次數。ALL 分佈在 KEY 分佈不適用的情況下搭配特定維度資料表使用時，可改善執行時間，但必須在效能提升與維護成本之間進行權衡。

DISTKEY (*column\$1name*)  
此限制條件會指定要做為資料表分佈索引鍵的資料欄。您可以在資料欄名稱後面使用 DISTKEY 關鍵字，或使用 DISTKEY (*column\$1name*) 語法使其成為資料表定義的一部分。兩種方法的效果一樣。如需詳細資訊，請參閱本主題前段的 DISTSTYLE 參數。

[COMPOUND \$1 INTERLEAVED ] SORTKEY (* column\$1name* [,...]) \$1 [ SORTKEY AUTO ]  
指定資料表的一個或多個排序索引鍵。當資料載入資料表時，資料會依指定為排序索引鍵的資料欄排序。您可以在資料欄名稱後面使用 SORTKEY 關鍵字指定單欄排序索引鍵，或使用 `SORTKEY (column_name [ , ... ] )` 語法指定一個或多個資料欄做為資料表的排序索引鍵資料欄。  
您也可以選擇指定 COMPOUND 或 INTERLEAVED 排序樣式。如果您使用資料欄指定 SORTKEY，則預設值為 COMPOUND。如需詳細資訊，請參閱[排序索引鍵](t_Sorting_data.md)。  
若沒有指定任何排序索引鍵選項，則預設值為 AUTO。  
您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄或 8 個 INTERLEAVED SORTKEY 資料欄。    
AUTO  
指定 Amazon Redshift 會根據資料表資料指派最佳排序索引鍵。例如，如果指定 AUTO 排序索引鍵，Amazon Redshift 一開始就不會為資料表指派任何排序索引鍵。如果 Amazon Redshift 判斷排序索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在變更資料表的排序索引鍵。資料表的實際排序是透過自動資料表排序來完成的。如需詳細資訊，請參閱[自動資料表排序](t_Reclaiming_storage_space202.md#automatic-table-sort)。  
Amazon Redshift 不會修改已具有排序或分佈索引鍵的資料表。有一個例外情況是，如果資料表具有從未在 JOIN 中使用過的分佈索引鍵，則當 Amazon Redshift 判斷有更好的索引鍵時，則索引鍵可能會變更。  
若要檢視資料表的排序索引鍵，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。若要檢視資料表的 Amazon Redshift Advisor 建議，請查詢 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md)。若要檢視 Amazon Redshift 所採取的動作，請查詢 SVL\$1AUTO\$1WORKER\$1ACTION 系統目錄檢視。如需詳細資訊，請參閱[SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md)。  
COMPOUND  
指定使用複合索引鍵排序資料，該索引鍵是由列出的所有資料欄組成，並依其列出順序排列。當查詢依據排序資料欄的順序掃描資料列時，複合排序索引鍵最實用。當查詢依賴次要排序資料欄時，使用複合索引鍵排序的效能優勢就會降低。您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄。  
INTERLEAVED  
指定使用交錯排序索引鍵排序資料。最多可以為交錯排序索引鍵指定八個資料欄。  
交錯排序索引鍵對排序索引鍵中的每個資料欄 (或資料欄子集) 都提供相等的權重，所以查詢不會取決於排序索引鍵中資料欄的順序。當查詢使用一個或多個次要排序資料欄時，交錯排序可大幅改善查詢效能。交錯排序在執行資料載入和清空操作時，會產生很少的額外負荷成本，  
不要在具有依序增加屬性 (如身分資料欄、日期或時間戳記) 的資料欄上使用交錯排序索引鍵。

ENCODE AUTO   
讓 Amazon Redshift 能夠自動調整資料表中所有資料欄的編碼類型，以最佳化查詢效能。ENCODE AUTO 會保留您在建立資料表時指定的初始編碼類型。然後，如果 Amazon Redshift 判斷新的編碼類型可以改善查詢效能，Amazon Redshift 就可以變更資料表資料欄的編碼類型。如果您沒有在資料表中的任何資料欄上指定編碼類型，ENCODE AUTO 就是預設值。

UNIQUE ( *column\$1name* [,...] )  
此限制條件會指定，資料表中一個包含一個或多個資料欄的群組只能包含唯一值。唯一資料表限制條件的行為與資料欄限制條件的行為相同，但多了可橫跨多個資料欄的額外功能。在唯一限制條件的細節中，不會將 null 值視為相等。每個唯一資料表限制條件必須命名一組資料欄，這組資料欄有別於為資料表所定義的任何其他唯一或主索引鍵限制條件所命名的資料欄組。  
 唯一限制條件僅供參考，系統不會強制執行它們。

PRIMARY KEY ( *column\$1name* [,...] )  
此限制條件會指定，資料表中的一個或多個資料欄只能包含唯一的 (不重複) 非 null 值。將一組資料欄識別為主索引鍵也會提供有關結構描述設計的中繼資料。主索引鍵表示，其他資料表可倚賴這組資料欄做為資料列的唯一識別碼。一個資料表中可指定一個主索引鍵，無論是單一資料欄限制條件或資料表限制條件都可行。主索引鍵限制條件應命名一組資料欄，這組資料欄有別於由為相同資料表所定義的任何唯一限制條件命名的其他資料欄組。  
 主索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

FOREIGN KEY ( *column\$1name* [, ... ] ) REFERENCES *reftable* [ ( *refcolumn* ) ]   
此限制條件會指定外部索引鍵限制條件，其要求新資料表中一個包含一個或多個資料欄的群組包含的值，只能是符合參考資料表中某一資料列之參考資料欄的值。如果省略 *refcolumn*，則會使用 *reftable* 的主索引鍵。參考資料欄必須為參考資料表中唯一或主索引鍵限制條件的資料欄。  
外部索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

## 使用須知
使用須知

唯一性、主索引鍵和外部索引鍵限制僅供參考，Amazon Redshift 不會在您填入資料表時*強制執行它們*。例如，如果您將資料插入具有相依性的資料表中，即使插入違反限制也可以成功執行。儘管如此，主索引鍵和外部索引鍵仍會做為規劃提示，而且如果您的 ETL 程序或應用程式中的某些其他程序強制其完整性，則應該宣告它們。如需如何捨棄具有相依性之資料表的資訊，請參閱 [DROP TABLE](r_DROP_TABLE.md)。

### 限制和配額
限制和配額

建立資料表時，請考量下列限制。
+ 根據節點類型，叢集中的資料表數目上限有所限制。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。
+ 資料表名稱的字元數上限為 127 個。
+ 單一資料表中可定義的資料欄數目上限為 1,600 個。
+ 單一資料表中可定義的 SORTKEY 資料欄數目上限為 400 個。

### 欄位層級設定和資料表層級設定的摘要


 在資料欄層級或資料表層級可設定數種屬性和設定。某些情況下，在資料欄層級或資料表層級設定屬性或限制條件的效果相同。而有些情況下則會產生不同的結果。

 下列清單摘要說明資料欄層級和資料表層級設定：

DISTKEY  
在資料欄層級或資料表層級設定的效果並無差異。  
如果設定了 DISTKEY，無論是在資料欄層級或資料表層級，DISTSTYLE 都必須設定為 KEY，或完全不設定。DISTSTYLE 只能在資料表層級設定。

SORTKEY  
若在資料欄層級設定，SORTKEY 必須是單一資料欄。若在資料表層級設定 SORTKEY，可由一個或多個資料欄組成複合或交錯的複合排序索引鍵。

COLLATE CASE\$1SENSITIVE \$1 COLLATE CASE\$1INSENSITIVE  
Amazon Redshift 不支援修改欄的區分大小寫組態。當您將新的欄附加到資料表時，Amazon Redshift 會使用預設值來區分大小寫。Amazon Redshift 在附加新的資料欄時不支援 COLLATE 關鍵字。  
如需如何使用資料庫定序建立資料庫的資訊，請參閱 [CREATE DATABASE](r_CREATE_DATABASE.md)。  
如需 COLLATE 函數的詳細資訊，請參閱 [COLLATE 函數](r_COLLATE.md)。

UNIQUE  
在資料欄層級可將一個或多個索引鍵設定為 UNIQUE；UNIQUE 限制條件會分別套用至每個資料欄。若在資料表層級設定 UNIQUE，可由一個或多個資料欄組成複合 UNIQUE 限制條件。

PRIMARY KEY  
若在資料欄層級設定，PRIMARY KEY 必須是單一資料欄。若在資料表層級設定 PRIMARY KEY，可由一個或多個資料欄組成複合主索引鍵。

FOREIGN KEY  
無論 FOREIGN KEY 是在資料欄層級或資料表層級設定，其效果並無差異。在資料欄層級的語法為單純的 `REFERENCES` *reftable* [( *refcolumn* )]。

### 傳入資料的分佈
傳入資料的分佈

當傳入資料的雜湊分佈機制與目標資料表的機制相同時，不需要在資料載入時實際分佈資料。例如，如果新資料表設定了分佈索引鍵，而且要從另一個分佈在相同索引鍵資料欄上的資料表插入資料，則會使用相同的節點和分割就地載入資料。不過，如果來源和目標資料表都設定為 EVEN 分佈，則資料會重新分佈至目標資料表中。

### 寬資料表
寬資料表

您或許能夠建立非常寬的資料表，但無法在資料表上執行查詢處理，像是 INSERT 或 SELECT 陳述式。有固定寬度資料欄 (如 CHAR) 的資料表寬度上限為 64KB - 1 (或 65535 個位元組)。如果資料表包含 VARCHAR 資料欄，資料表就能擁有較大的宣告寬度，而不會傳回錯誤，因為 VARCHARS 資料欄的宣告寬度不會完全計入計算出的查詢處理限制。VARCHAR 資料欄的有效查詢處理限制會因為一些因素而不同。

如果資料表對於插入或選取操作來說太寬，您會收到下列錯誤。

```
ERROR:  8001
DETAIL:  The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
```

## 範例
範例

如需示範如何使用 CREATE TABLE 命令的範例，請參閱 [範例](r_CREATE_TABLE_examples.md) 主題。

# 範例
範例

以下範例示範 Amazon Redshift CREATE TABLE 陳述式中各種不同的資料欄和資料表屬性。如需 CREATE TABLE 的相關資訊，包括參數定義，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

許多範例都使用 *TICKIT* 範例資料集中的資料表和資料。如需詳細資訊，請參閱 [tz 資料庫](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。

 您可以在 CREATE TABLE 命令中使用資料庫名稱和結構描述名稱作為資料表名稱的字首。例如：`dev_database.public.sales`。資料庫名稱必須是您所連線的資料庫。任何在另一個資料庫中建立資料庫物件的嘗試都會失敗，並顯示操作無效錯誤。

## 建立含有分佈索引鍵、複合排序索引鍵和壓縮的資料表


下列範例會在 TICKIT 資料庫中建立 SALES 資料表，並且為數個資料欄定義壓縮。LISTID 會宣告為分佈索引鍵，而 LISTID 和 SELLERID 會宣告為多資料欄複合排序索引鍵。另外也會為資料表定義主索引鍵和外部索引鍵限制條件。在範例中建立資料表之前，如果限制條件不存在，您可能需要將 UNIQUE 條件限制新增至外部索引鍵參考的每個資料行。

```
create table sales(
salesid integer not null,
listid integer not null,
sellerid integer not null,
buyerid integer not null,
eventid integer not null encode mostly16,
dateid smallint not null,
qtysold smallint not null encode mostly8,
pricepaid decimal(8,2) encode delta32k,
commission decimal(8,2) encode delta32k,
saletime timestamp,
primary key(salesid),
foreign key(listid) references listing(listid),
foreign key(sellerid) references users(userid),
foreign key(buyerid) references users(userid),
foreign key(dateid) references date(dateid))
distkey(listid)
compound sortkey(listid,sellerid);
```

結果如下：

```
schemaname | tablename | column     | type                        | encoding | distkey | sortkey | notnull
-----------+-----------+------------+-----------------------------+----------+---------+---------+--------
public     | sales     | salesid    | integer                     | lzo      | false   |       0 | true
public     | sales     | listid     | integer                     | none     | true    |       1 | true
public     | sales     | sellerid   | integer                     | none     | false   |       2 | true
public     | sales     | buyerid    | integer                     | lzo      | false   |       0 | true
public     | sales     | eventid    | integer                     | mostly16 | false   |       0 | true
public     | sales     | dateid     | smallint                    | lzo      | false   |       0 | true
public     | sales     | qtysold    | smallint                    | mostly8  | false   |       0 | true
public     | sales     | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | commission | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

下列範例會使用不區分大小寫的資料欄 col1 建立資料表 t1。

```
create table T1 (
  col1 Varchar(20) collate case_insensitive
 );
            
insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');
```

查詢資料表：

```
select * from T1 where col1 = 'John';
   
col1
------
 john
 JOHN
(2 rows)
```

## 使用交錯排序索引鍵建立資料表
使用交錯排序索引鍵建立資料表

以下範例會建立具有交錯排序索引鍵的 CUSTOMER 資料表。

```
create table customer_interleaved (
  c_custkey     	integer        not null,
  c_name        	varchar(25)    not null,
  c_address     	varchar(25)    not null,
  c_city        	varchar(10)    not null,
  c_nation      	varchar(15)    not null,
  c_region      	varchar(12)    not null,
  c_phone       	varchar(15)    not null,
  c_mktsegment      varchar(10)    not null)
diststyle all
interleaved sortkey (c_custkey, c_city, c_mktsegment);
```

## 使用 IF NOT EXISTS 建立資料表
使用 IF NOT EXISTS 建立資料表

 下列範例會建立 CITIES 資料表，或不執行任何動作，並於該資料表已存在時傳回訊息：

```
create table if not exists cities(
cityid integer not null,
city varchar(100) not null,
state char(2) not null);
```

## 建立採用 ALL 分佈的資料表
建立採用 ALL 分佈的資料表

 以下範例會建立採用 ALL 分佈的 VENUE 資料表。

```
create table venue(
venueid smallint not null,
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid))
diststyle all;
```

## 建立採用 EVEN 分佈的資料表
建立採用 EVEN 分佈的資料表

以下範例會建立名為 MYEVENT 且包含三個資料欄的資料表。

```
create table myevent(
eventid int,
eventname varchar(200),
eventcity varchar(30))
diststyle even;
```

資料表會均勻分佈且不會排序。資料表沒有宣告的 DISTKEY 或 SORTKEY 欄。

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'myevent';
            
  column   |          type          | encoding | distkey | sortkey
-----------+------------------------+----------+---------+---------
 eventid   | integer                | lzo      | f       |       0
 eventname | character varying(200) | lzo      | f       |       0
 eventcity | character varying(30)  | lzo      | f       |       0
(3 rows)
```

## 建立 LIKE (類似) 另一個資料表的暫時資料表
建立 LIKE (類似) 另一個資料表的暫時資料表

以下範例會建立名為 TEMPEVENT 的臨時資料表，它的資料欄繼承自 EVENT 資料表。

```
create temp table tempevent(like event); 
```

此資料表也會繼承其父資料表的 DISTKEY 和 SORTKEY 屬性：

```
select "column", type, encoding, distkey, sortkey
 from pg_table_def where tablename = 'tempevent';

  column   |            type             | encoding | distkey | sortkey
-----------+-----------------------------+----------+---------+---------
 eventid   | integer                     | none     | t       |       1
 venueid   | smallint                    | none     | f       |       0
 catid     | smallint                    | none     | f       |       0
 dateid    | smallint                    | none     | f       |       0
 eventname | character varying(200)      | lzo      | f       |       0
 starttime | timestamp without time zone | bytedict | f       |       0
(6 rows)
```

## 建立具有 IDENTITY 欄位的資料表
建立具有 IDENTITY 欄位的資料表

以下範例會建立名為 VENUE\$1IDENT 的資料表，其中有一個名為 VENUEID 的 IDENTITY 資料欄。此資料欄從 0 開始，並隨每筆記錄遞增 1。VENUEID 也會宣告為資料表的主索引鍵。

```
create table venue_ident(venueid bigint identity(0, 1),
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid));
```

## 建立具有預設 IDENTITY 欄位的資料表
建立具有預設 IDENTITY 欄位的資料表

以下範例會建立名為 `t1` 的資料表。此資料表具有名為 `hist_id` 的 IDENTITY 資料欄，以及名為 `base_id` 的預設 IDENTITY 資料欄。

```
CREATE TABLE t1(
  hist_id BIGINT IDENTITY NOT NULL, /* Cannot be overridden */
  base_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, /* Can be overridden */
  business_key varchar(10) ,
  some_field varchar(10)
);
```

將資料列插入至資料表顯示已同時產生 `hist_id` 及 `base_id` 值。

```
INSERT INTO T1 (business_key, some_field) values ('A','MM');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
```

插入第二列顯示已產生 `base_id` 的預設值。

```
INSERT INTO T1 (base_id, business_key, some_field) values (DEFAULT, 'B','MNOP');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
```

插入第三列顯示 `base_id` 的值不需要是唯一的。

```
INSERT INTO T1 (base_id, business_key, some_field) values (2,'B','MNNN');
```

```
SELECT * FROM t1;
            
 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
       3 |       2 | B            | MNNN
```

## 建立具有 DEFAULT 欄位的資料表
建立具有 DEFAULT 欄位的資料表

下列範例會建立 CATEGORYDEF 資料表，它會宣告每個資料欄的預設值：

```
create table categorydef(
catid smallint not null default 0,
catgroup varchar(10) default 'Special',
catname varchar(10) default 'Other',
catdesc varchar(50) default 'Special events',
primary key(catid));
            
insert into categorydef values(default,default,default,default);
```

```
select * from categorydef;
            
 catid | catgroup | catname |    catdesc
-------+----------+---------+----------------
     0 | Special  | Other   | Special events
(1 row)
```

## DISTSTYLE、DISTKEY 和 SORTKEY 選項
DISTSTYLE、DISTKEY 和 SORTKEY 選項

下列範例說明 DISTKEY、SORTKEY 和 DISTSTYLE 選項的運作方式。在此範例中，COL1 是分佈索引鍵，因此分佈樣式必須設定為 KEY，或是不設定。根據預設，資料表沒有排序索引鍵，因此不會排序：

```
create table t1(col1 int distkey, col2 int) diststyle key;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't1';

column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | az64     | t       | 0
col2   | integer | az64     | f       | 0
```

在下列範例中，會將同一個資料欄定義為分佈索引鍵和排序索引鍵。同樣地，分佈樣式必須設定為 KEY，或是不設定。

```
create table t2(col1 int distkey sortkey, col2 int);
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't2';
            
column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | none     | t       | 1
col2   | integer | az64     | f       | 0
```

在下列範例中，不會將任何資料欄設定為分佈索引鍵，COL2 會設定為排序索引鍵，而分佈樣式會設定為 ALL：

```
create table t3(col1 int, col2 int sortkey) diststyle all;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't3';
            
Column |  Type   | Encoding | DistKey | SortKey
-------+---------+----------+---------+--------
col1   | integer | az64     | f       | 0
col2   | integer | none     | f       | 1
```

在下列範例中，分佈樣式會設定為 EVEN，但不會明確定義任何排序索引鍵；因此，資料表會均勻分佈，但不會排序。

```
create table t4(col1 int, col2 int) diststyle even;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't4';
            
             column |  type   |encoding | distkey | sortkey
--------+---------+---------+---------+--------
col1    | integer | az64    | f       | 0
col2    | integer | az64    | f       | 0
```

## 使用 ENCODE AUTO 選項建立資料表


下列範例會建立具有自動壓縮編碼的 `t1` 資料表。如果您沒有在任何資料欄上指定編碼類型，ENCODE AUTO 就是資料表的預設值。

```
create table t1(c0 int, c1 varchar);
```

下列範例會透過指定 ENCODE AUTO 建立具有自動壓縮編碼的 `t2` 資料表。

```
create table t2(c0 int, c1 varchar) encode auto;
```

下列範例會透過指定 ENCODE AUTO 建立具有自動壓縮編碼的 `t3` 資料表。資料欄 `c0` 是以初始編碼類型 DELTA 所定義。如果其他編碼提供更好的查詢效能，Amazon Redshift 可以變更編碼。

```
create table t3(c0 int encode delta, c1 varchar) encode auto;
```

下列範例會透過指定 ENCODE AUTO 建立具有自動壓縮編碼的 `t4` 資料表。資料欄 `c0` 是以初始編碼 DELTA 來定義，而資料欄 `c1` 則以 LZO 初始編碼來定義。如果其他編碼提供更好的查詢效能，Amazon Redshift 可以變更這些編碼。

```
create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;
```