CREATE TABLE - Amazon Redshift

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

CREATE TABLE

在目前資料庫中建立新的資料表。此資料表的擁有者是 CREATE TABLE 命令的發行者。

必要的權限

以下是創建表所需的權限:

  • 超級使用者

  • 具有「創建表」權限的用户

Syntax (語法)

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_attribute] where column_attributes are: [ DEFAULT default_expr ] [ IDENTITY ( seed, step ) ] [ GENERATED BY DEFAULT AS IDENTITY ( seed, step ) ] [ ENCODE encoding ] [ DISTKEY ] [ SORTKEY ] [ COLLATE CASE_SENSITIVE | COLLATE CASE_INSENSITIVE ] 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 ]

參數

LOCAL

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

TEMPORARY | TEMP

建立臨時資料表的關鍵字,只能在目前工作階段中看見。資料表會在建立所在的工作階段結束時自動捨棄。臨時資料表可與永久資料表同名。臨時資料表是以不同的工作階段專屬結構描述建立 (您無法指定此結構描述的名稱)。此臨時結構描述會成為搜尋路徑中的第一個結構描述,因此,除非您以結構描述名稱限定資料表名稱來存取永久資料表,否則臨時資料表的優先順序高於永久資料表。如需結構描述和優先順序的詳細資訊,請參閱 search_path

注意

根據預設,使用者依其 PUBLIC 群組中的自動成員資格,具有建立臨時資料表的許可。若要拒絕使用者的此權限,請撤銷 PUBLIC 群組的 TEMP 權限,然後明確將 TEMP 權限僅授予特定使用者或使用者群組。

IF NOT EXISTS

此子句會指出,若指定的資料表已存在,則命令不應進行任何變更,且應傳回資料表存在的訊息,而不是在發生錯誤的情況下終止。請注意,現有資料表可能與這裡建立的資料表完全不一樣;只會使用資料表名稱做為比較。

此子句在編寫指令碼時很實用,如此指令碼就不會因為 CREATE TABLE 嘗試建立已存在的資料表而失敗。

table_name

要建立的資料表名稱。

重要

若您指定 '#' 開頭的資料表名稱,所建立的資料表會是臨時資料表。以下是範例:

create table #newtable (id int);

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

create table tickit.public.test (c1 int);

如果資料庫或結構描述不存在,則不會建立資料表,而且陳述式會傳回錯誤。您無法在系統資料庫 template0template1padb_harvest 中建立資料表或檢視。

若提供結構描述名稱,則會在該結構描述中建立新資料表 (假設建立者具有存取結構描述的權限)。資料表名稱對於該結構描述來說必須是唯一的。如果未指定結構描述,則會使用目前資料庫結構描述建立資料表。如果您要建立臨時資料表,就不能指定結構描述名稱,因為臨時資料表會採用特殊結構描述。

若臨時資料表是在不同的工作階段中建立的話,在同一個資料庫中可同時有多個同名的臨時資料表存在,因為資料表會指派至不同的結構描述。如需有效名稱的詳細資訊,請參閱 名稱與識別符

column_name

要在新資料表中建立的資料欄名稱。資料欄名稱的長度上限為 127 個位元組;超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元,最長可達 4 個位元組。單一資料表中可定義的資料欄數目上限為 1,600 個。如需有效名稱的詳細資訊,請參閱 名稱與識別符

注意

若您要建立「寬資料表」,則務必注意,在載入和查詢處理期間,您的資料欄清單未超過中繼結果的資料列寬度界限。如需詳細資訊,請參閱 使用須知

data_type

要建立之資料欄的資料類型。若是 CHAR 和 VARCHAR 資料欄,您可以改用 MAX 關鍵字,而不宣告長度上限。MAX 會將 CHAR 的長度上限設定為 4,096 個位元組,或將 VARCHAR 的長度上限設定為 65535 個位元組。GEOMETRY 物件的大小上限是 1,048,447 位元組。

如需 Amazon Redshift 所支援的資料類型的資訊,請參資料類型

DEFAULT default_expr

此子句會指派資料欄的預設資料值。default_expr 的資料類型必須符合資料欄的資料類型。DEFAULT 值必須是無變數的表達式。不允許子查詢、目前資料表中其他資料欄的交叉參考,以及使用者定義的功能。

default_expr 表達式是在未指定資料欄值的任何 INSERT 操作中使用。若未指定預設值,則資料欄的預設值為 null。

若在既定資料欄清單上進行的 COPY 操作省略有 DEFAULT 值的資料欄,則 COPY 命令會插入 default_expr 的值。

IDENTITY(seed, step)

此子句會指出資料欄是 IDENTITY 資料欄。IDENTITY 資料欄包含唯一的自動產生值。IDENTITY 資料欄的資料類型必須是 INT 或 BIGINT。

當您使用 INSERTINSERT INTO [tablename] VALUES() 陳述式新增資料列時,這些值會從指定為 seed 的值開始,並依指定為 step 的數字遞增。

使用 INSERT INTO [tablename] SELECT * FROMCOPY 陳述式載入資料表時,會並行載入資料並將其分發至節點片段。為了確保身分值是唯一的,Amazon Redshift 會在建立身分值時略過若幹值。身分值是唯一的,但順序可能不符合來源檔案中的順序。

GENERATED BY DEFAULT AS IDENTITY(seed, step)

指定資料欄是預設 IDENTITY 資料欄的子句,其可讓您自動將唯一值指派給資料欄。IDENTITY 資料欄的資料類型必須是 INT 或 BIGINT。當您新增沒有值的資料列時,這些值會從指定為 seed 的值開始,並依指定為 step 的數字遞增。如需如何產生值的詳細資訊,請參閱IDENTITY

此外,在 INSERT、UPDATE 或 COPY 期間,您可以提供沒有 EXPLICIT_IDS 的值。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

資料欄的壓縮編碼。編碼自動是表的默認設置。Amazon Redshift 會自動管理表中所有列的壓縮編碼。如果為表中的任何列指定壓縮編碼,則表不再設置為 ENCODE AUTO。Amazon Redshift 不再自動管理表中所有列的壓縮編碼。您可以為表指定 ENCODE AUTO 選項,以使 Amazon Redshift 能夠自動管理表中所有列的壓縮編碼。

Amazon Redshift 會自動為您未指定壓縮編碼的列分配初始壓縮編碼,如下所示:

  • 暫時資料表中的所有資料欄預設都會有指派的 RAW 壓縮。

  • 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。

  • 定義為 BOOLEAN、REAL、DOUBLE PRECISION、GEOMETRY 或 GEOMETRY 資料類型的資料行會有指派的 R

  • 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DECIMAL、DECIMAL、DATE、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。

  • 定義為 CHAR、VARCHAR 或 VARBITE 的資料欄會有指派的 LZO 壓縮。

注意

若您不想要壓縮資料欄,請明確指定 RAW 編碼。

支援以下 compression encodings

  • AZ64

  • BYTEDICT

  • DELTA

  • DELTA32K

  • LZO

  • MOSTLY8

  • MOSTLY16

  • MOSTLY32

  • RAW (無壓縮)

  • RUNLENGTH

  • TEXT255

  • TEXT32K

  • ZSTD

DISTKEY

此關鍵字會指定資料欄是資料表的分佈索引鍵。資料表中只能有一個資料欄是分佈索引鍵。您可以在資料欄名稱後面使用 DISTKEY 關鍵字,或使用 DISTKEY (column_name) 語法使其成為表格定義的一部分。兩種方法的效果一樣。如需詳細資訊,請參閱本主題稍後的 DISTSTYLE 參數。

分配鍵列的數據類型可以是:BOOLEAN、REAL、DOUBLE PRECISION、SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIMESTAMPTZ、CHAR 或 VARCHAR。

SORTKEY

此關鍵字會指定資料欄是資料表的排序索引鍵。當資料載入資料表時,資料會依指定為排序索引鍵的一個或多個資料欄排序。您可以在資料欄名稱後面使用 SORTKEY 關鍵字指定單欄排序索引鍵,或使用 SORTKEY (column_name [, ...]) 語法指定一個或多個資料欄做為資料表的排序索引鍵資料欄。此語法只會建立複合排序索引鍵。

您最多可為每個資料表定義 400 個 SORTKEY 資料欄。

排序鍵列的數據類型可以是:BOOLEAN、REAL、DOUBLE PRECISION、SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIMESTAMPTZ、CHAR 或 VARCHAR。

整理大小寫敏感 | 整理不區分大小寫

一個子句,它指定對列的字符串搜索或比較是區分大小寫還是不區分大小寫。缺省值與數據庫的當前區分大小寫配置相同。

若要查找資料庫歸類資料庫資料庫,請使用下列命令:

select db_collation(); db_collation ---------------- case_sensitive (1 row)
NOT NULL | NULL

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

UNIQUE

此關鍵字會指定資料欄只能包含唯一值。唯一資料表限制條件的行為與資料欄限制條件的行為相同,但多了可橫跨多個資料欄的額外功能。若要定義唯一資料表限制條件,請使用 UNIQUE (column_name [, ... ]) 語法。

重要

唯一限制條件僅供參考,系統不會強制執行它們。

PRIMARY KEY

此關鍵字會指定資料欄是資料表的主索引鍵。只能使用資料欄定義將一個資料欄定義為主索引鍵。若要定義具有多資料欄主索引鍵的資料表限制條件,請使用 PRIMARY KEY (column_name [, ... ]) 語法。

將資料欄識別為主索引鍵即可提供有關結構描述設計的中繼資料。主索引鍵表示,其他資料表可倚賴這組資料欄做為資料列的唯一識別符。一個資料表中可指定一個主索引鍵,無論是資料欄限制條件或資料表限制條件都可行。主索引鍵限制條件應命名一組資料欄,這組資料欄有別於由為相同資料表所定義的任何唯一限制條件命名的其他資料欄組。

重要

主索引鍵條件限制僅供參考。系統不會強制執行這些限制,不過規劃器會使用這些限制。

References reftable [ ( refcolumn ) ]

此子句會指定外部索引鍵限制條件,表示資料欄包含的值只能是符合參考資料表中某一資料列之參考資料欄的值。參考資料欄應為參考資料表中唯一或主索引鍵限制條件的資料欄。

重要

外部索引鍵條件限制僅供參考。系統不會強制執行這些限制,不過規劃器會使用這些限制。

LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ]

此子句會指定現有資料表,新資料表會自動從該資料表複製資料欄名稱、資料類型及 NOT NULL 限制條件。新資料表和父資料表是分開的,對父資料表所做的變更不會套用至新資料表。複製資料欄定義的預設表達式只會在指定了 INCLUDING DEFAULTS 時複製。預設行為是執行預設表達式,如此一來,新資料表中所有資料欄的預設值都是 null。

使用 LIKE 選項建立的資料表不會繼承主索引鍵和外部索引鍵限制條件。LIKE 資料表會繼承分佈樣式、排序索引鍵、BACKUP 和 NULL 屬性,但您無法明確設定這些屬性在 CREATE TABLE... LIKE 陳述式。

BACKUP { YES | NO }

此子句會指定資料表是否應包含在自動化和手動叢集快照中。若是像臨時資料表這類不會包含重要資料的資料表,指定 BACKUP NO 可以在建立快照以及從快照還原時節省處理時間,並減少 Amazon 簡單存儲服務上的儲存空間。BACKUP NO 設定對於將資料自動複寫到叢集內其他節點的操作並無影響,因此指定了 BACKUP NO 的資料表會在節點故障時還原。預設值為 BACKUP YES。

DISTSTYLE { AUTO | EVEN | KEY | ALL }

用於定義整個表的數據分配樣式的關鍵字。Amazon Redshift 會根據您為資料表指定的分佈樣式,將資料表的列分佈至運算節點。預設值為 AUTO。

您為資料表選取的分佈樣式會影響資料庫的整體效能。如需詳細資訊,請參閱 使用數據分配樣式。可能的分佈樣式如下:

  • 自動:Amazon Redshift 會根據資料表資料來指派最佳分佈樣式。例如,如果指定 AUTO 分佈樣式,Amazon Redshift 會對小型資料表指派 ALL 分佈樣式,然後在資料表變得更大時,將資料表變更為 EVEN 分佈。如果 Amazon Redshift 確定分配密鑰將提高查詢的性能,則 Amazon Redshift 可能會將 DISSTYLE 更改為 KEY 並將分配密鑰分配給您的表。分佈樣式的變更是在背景中發生,對用户查詢的影響最小。

    若要檢視套用至資料表的分佈樣式,請查詢 PG_CLASS 系統目錄資料表。如需詳細資訊,請參閱 檢視分佈樣式

  • EVEN:資料表中的資料會採循環分佈的方式,均勻分配到叢集中的各個節點。資料列 ID 會用來決定分佈,並且將大致相同的資料列數分佈到每個節點。

  • 金鑰:資料是依 DISTKEY 資料欄中的值分佈。當您將聯結資料表的聯結資料欄設定為分佈索引鍵時,兩個資料表的聯結資料列會在運算節點上並存。資料並存時,最佳化工具就能更有效率地執行聯結。若您指定 DISTSTYLE KEY,則必須命名 DISTKEY 資料欄,無論是資料表或做為資料欄定義的一部分皆可。如需詳細資訊,請參閱本主題前段的 DISTKEY 參數。

  • ALL:整個資料表的副本分佈至每個節點。此分佈樣式可確保每個節點上都有任何聯結所需的所有資料列,但儲存空間的需求也會倍增,並且會增加資料表的負載和維護次數。ALL 分佈在 KEY 分佈不適用的情況下搭配特定維度資料表使用時,可改善執行時間,但必須在效能提升與維護成本之間進行權衡。

DISTKEY (column_name)

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

[化合物 | 交錯] 排序鍵 (column_name[,...]) | [排序鍵自動]

指定資料表的一個或多個排序索引鍵。當資料載入資料表時,資料會依指定為排序索引鍵的資料欄排序。您可以在資料欄名稱後面使用 SORTKEY 關鍵字指定單欄排序索引鍵,或使用 SORTKEY (column_name [ , ... ] ) 語法指定一個或多個資料欄做為資料表的排序索引鍵資料欄。

您也可以選擇指定 COMPOUND 或 INTERLEAVED 排序樣式。如果使用列指定 SORTKEY,則默認值為複合。如需詳細資訊,請參閱 使用排序索引鍵

如果您未指定任何排序鍵選項,則預設為 AUTO。

您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄或 8 個 INTERLEAVED SORTKEY 資料欄。

AUTO

指定 Amazon Redshift 會根據資料表資料來指派最佳排序鍵。例如,如果指定了 AUTO 排序鍵,Amazon Redshift 最初不會為表分配任何排序鍵。如果 Amazon Redshift 確定排序鍵將提高查詢的性能,則 Amazon Redshift 可能會更改表的排序鍵。表的實際排序是通過自動表排序來完成的。如需詳細資訊,請參閱 自動資料表排序

Amazon Redshift 不會修改具有現有排序鍵或分配鍵的表。除了一個例外,如果表具有從未在 JOIN 中使用過的分配密鑰,則如果 Amazon Redshift 確定存在更好的密鑰,則可能會更改密鑰。

若要檢視資料表的排序索引鍵,請查詢 SVV_TABLE_INFO 系統目錄檢視。如需詳細資訊,請參閱 SVV_TABLE_INFO。要查看 Amazon Redshift 指導針對表的建議,請查詢 SVV_ALTER_TABLE_TABLE 推薦系統目錄視圖。如需詳細資訊,請參閱 轉換表 _ 推薦。要查看 Amazon Redshift 執行的操作,請查詢 SVL_AUTO_WORKER_ 操作系統目錄視圖。如需詳細資訊,請參閱 自動工作者操作

COMPOUND

指定使用複合索引鍵排序資料,該索引鍵是由列出的所有資料欄組成,並依其列出順序排列。當查詢依據排序資料欄的順序掃描資料列時,複合排序索引鍵最實用。當查詢依賴次要排序資料欄時,使用複合索引鍵排序的效能優勢就會降低。您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄。

INTERLEAVED

指定使用交錯排序索引鍵排序資料。最多可以為交錯排序索引鍵指定八個資料欄。

交錯排序索引鍵對排序索引鍵中的每個資料欄 (或資料欄子集) 都提供相等的權重,所以查詢不會取決於排序索引鍵中資料欄的順序。當查詢使用一個或多個次要排序資料欄時,交錯排序可大幅改善查詢效能。交錯排序在執行資料載入和清空操作時,會產生很少的額外負荷成本,

重要

不要在具有依序增加屬性 (如身分資料欄、日期或時間戳記) 的資料欄上使用交錯排序索引鍵。

AUTOCODE

使 Amazon Redshift 能夠自動調整表中所有列的編碼類型,以優化查詢性能。編碼自動保留您在創建表時指定的初始編碼類型。然後,如果 Amazon Redshift 確定新的編碼類型可以提高查詢性能,則 Amazon Redshift 可以更改表列的編碼類型。如果您沒有在表中的任何列上指定編碼類型,則默認值為 ENCODE AUTO。

UNIQUE ( column_name [,...] )

此限制條件會指定,資料表中一個包含一個或多個資料欄的群組只能包含唯一值。唯一資料表限制條件的行為與資料欄限制條件的行為相同,但多了可橫跨多個資料欄的額外功能。在唯一限制條件的細節中,不會將 null 值視為相等。每個唯一資料表限制條件必須命名一組資料欄,這組資料欄有別於為資料表所定義的任何其他唯一或主索引鍵限制條件所命名的資料欄組。

重要

唯一限制條件僅供參考,系統不會強制執行它們。

PRIMARY KEY ( column_name [,...] )

此限制條件會指定,資料表中的一個或多個資料欄只能包含唯一的 (不重複) 非 null 值。將一組資料欄識別為主索引鍵也會提供有關結構描述設計的中繼資料。主索引鍵表示,其他資料表可倚賴這組資料欄做為資料列的唯一識別符。一個資料表中可指定一個主索引鍵,無論是單一資料欄限制條件或資料表限制條件都可行。主索引鍵限制條件應命名一組資料欄,這組資料欄有別於由為相同資料表所定義的任何唯一限制條件命名的其他資料欄組。

重要

主索引鍵條件限制僅供參考。系統不會強制執行這些限制,不過規劃器會使用這些限制。

FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]

此限制條件會指定外部索引鍵限制條件,其要求新資料表中一個包含一個或多個資料欄的群組包含的值,只能是符合參考資料表中某一資料列之參考資料欄的值。如果省略 refcolumn,則會使用 reftable 的主索引鍵。參考資料欄必須為參考資料表中唯一或主索引鍵限制條件的資料欄。

重要

外部索引鍵條件限制僅供參考。系統不會強制執行這些限制,不過規劃器會使用這些限制。