ALTER TABLE - Amazon Redshift

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

ALTER TABLE

變更資料庫資料表或 Amazon Redshift Spectrum 外部資料表的定義。此命令會更新 CREATE TABLE 或 CREATE EXTERNAL TABLE 所設定的值和屬性。

您不能在交易區塊內的外部資料表上執行 ALTER TABLE (交易區塊:BEGIN … END)。如需交易的詳細資訊,請參閱 可序列化隔離

ALTER TABLE 會鎖定資料表的讀取和寫入操作,直到包圍 ALTER TABLE 操作的交易完成,除非在資料表變更時可以查詢數據或對資料表執行其他操作。

必要的權限

以下是 ALTER 表所需的權限:

  • 超級使用者

  • 具有 ALTER 表權限的用户

  • 表或架構所有者

Syntax (語法)

ALTER TABLE table_name 
{
ADD table_constraint 
| DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ] 
| OWNER TO new_owner 
| RENAME TO new_name 
| RENAME COLUMN column_name TO new_name            
| ALTER COLUMN column_name TYPE new_data_type
| ALTER COLUMN column_name ENCODE new_encode_type     
| ALTER COLUMN column_name ENCODE encode_type, 
| ALTER COLUMN column_name ENCODE encode_type, .....;      
| ALTER DISTKEY column_name 
| ALTER DISTSTYLE ALL       
| ALTER DISTSTYLE EVEN
| ALTER DISTSTYLE KEY DISTKEY column_name 
| ALTER DISTSTYLE AUTO             
| ALTER [COMPOUND] SORTKEY ( column_name [,...] ) 
| ALTER SORTKEY AUTO 
| ALTER SORTKEY NONE
| ALTER ENCODE AUTO
| ADD [ COLUMN ] column_name column_type
  [ DEFAULT default_expr ]
  [ ENCODE encoding ]
  [ NOT NULL | NULL ] |
| DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] }

where table_constraint is:

[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] )  
| PRIMARY KEY ( column_name [, ... ] ) 
| FOREIGN KEY (column_name [, ... ] )
   REFERENCES  reftable [ ( refcolumn ) ]}

The following options apply only to external tables:

SET LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' } 
| SET FILE FORMAT format |
| SET TABLE PROPERTIES ('property_name'='property_value') 
| PARTITION ( partition_column=partition_value [, ...] ) 
  SET LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' } 
| ADD [IF NOT EXISTS] 
    PARTITION ( partition_column=partition_value [, ...] ) LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' }
    [, ... ]
| DROP PARTITION ( partition_column=partition_value [, ...] )  

若要減少執行 ALTER TABLE 命令的時間,你可以結合 ALTER TABLE 命令的部分子句。

Amazon Redshift 支援 ALTER TABLE 子句的以下組合:

ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTKEY column_Id; ALTER TABLE tablename ALTER DISTKEY column_Id, ALTER SORTKEY (column_list); ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTSTYLE ALL; ALTER TABLE tablename ALTER DISTSTYLE ALL, ALTER SORTKEY (column_list);

參數

table_name

要修改的資料表名稱。僅指定資料表的名稱,或使用格式 schema_name.table_name 來使用專屬結構描述。外部資料表必須以外部結構描述名稱限定。如果您要使用 ALTER TABLE 陳述式重新命名檢視或變更其擁有者,則也可以指定檢視名稱。資料表名稱的長度上限為 127 個位元組;超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元,最長可達 4 個位元組。如需有效名稱的詳細資訊,請參閱 名稱與識別符

ADD table_constraint

新增指定限制條件至資料表的子句。如需有效 table_constraint 值得說明,請參閱 CREATE TABLE

注意

您無法將主索引鍵限制條件新增至可為 null 的資料欄。如果資料欄原本是以 NOT NULL 限制條件建立,則您可以新增主索引鍵限制條件。

DROP CONSTRAINT constraint_name

從資料表中刪除具名限制條件的子句。若要刪除限制條件,請指定限制條件名稱,而非限制條件類型。若要檢視資料表限制條件名稱,請執行下列查詢。

select constraint_name, constraint_type from information_schema.table_constraints;
RESTRICT

僅移除指定限制條件的子句。RESTRICT 是 DROP CONSTRAINT 的選項。RESTRICT 不能搭配 CASCADE 使用。

CASCADE

此子句會移除指定限制條件及相依於該限制條件的任何項目。CASCADE 是 DROP CONSTRAINT 的選項。CASCADE 不能搭配 RESTRICT 使用。

OWNER TO new_owner

此子句會將資料表 (或檢視) 的擁有者變更為 new_owner 值。

RENAME TO new_name

此子句會將資料表 (或檢視) 重新命名為 new_name 中指定的值。資料表名稱長度上限為 127 個位元組;超過此長度的名稱會截斷至 127 個位元組。

您無法將永久資料表重新命名為開頭為 '#' 的名稱。開頭為 '#' 的資料表名稱代表暫時資料表。

您無法重新命名外部資料表。

ALTER COLUMN column_name TYPE new_data_type

子句,會變更定義為 VARCHAR 資料類型的資料欄大小。考量下列限制:

  • 您無法更改具有以下壓縮編碼的欄位:BYTEDICT、RUNLENGTH、TEXT255 或 TEXT32K。

  • 您無法將大小降低至小於現有資料的大小上限。

  • 您無法更改含預設值的資料欄。

  • 您無法更改具有 UNIQUE、PRIMARY KEY 或 FOREIGN KEY 的資料欄。

  • 您無法在交易區塊內改變資料行 (交易區塊:BEGIN … END)。如需交易的詳細資訊,請參閱 可序列化隔離

ALTER LETOcolumn_name譯成電碼新編碼類型

用於更改資料欄壓縮編碼的子句。如果為列指定壓縮編碼,則表不再設置為 ENCODE AUTO。如需壓縮編碼的詳細資訊,請參使用列壓縮

更改列的壓縮編碼時,該表仍可供查詢。

考量下列限制:

  • 不能將列更改為與當前為該列定義的相同編碼。

  • 不能使用交錯順序鍵更改表中列的編碼。

ALTER LETOcolumn_name譯成電碼編碼類型, 更改列column_name譯成電碼編碼類型、 ... ;

在單個命令中更改多列的壓縮編碼的子句。如需壓縮編碼的詳細資訊,請參使用列壓縮

更改列的壓縮編碼時,該表仍可供查詢。

考量下列限制:

  • 不能在單個命令中多次將列更改為相同或不同的編碼類型。

  • 不能將列更改為與當前為該列定義的相同編碼。

  • 不能使用交錯順序鍵更改表中列的編碼。

ALTER DISTSTYLE ALL

將資料表的現有分佈樣式變更為 ALL 的子句。考慮下列各項:

  • 無法同時在相同資料表上執行 ALTER DISTSYTLE、ALTER SORTKEY 和 VACUUM。

    • 如果 VACUUM 目前執行中,然後執行 ALTER DISTSTYLE ALL 會傳回錯誤。

    • 如果 ALTER DISTSTYLE ALL 執行中,則不會在資料表上啟動背景清空。

  • 包含交錯排序索引鍵的資料表和暫存資料表不支援 ALTER DISTSTYLE ALL 命令。

  • 如果先前將分配樣式定義為 AUTO,則表不再是自動表優化的候選項。

如需 DISTSTYLE ALL 的詳細資訊,請參閱 CREATE TABLE

ALTER DISTSTYLE EVEN

將資料表的現有分佈樣式變更為 EVEN 的子句。考慮下列各項:

  • 無法同時在相同資料表上執行 ALTER DISTSYTLE、ALTER SORTKEY 和 VACUUM。

    • 如果 VACUUM 目前執行中,然後執行 ALTER DISTSTYLE EVEN 會傳回錯誤。

    • 如果 ALTER DISTSTYLE EVEN 執行中,則不會在資料表上啟動背景清空。

  • 包含交錯排序索引鍵的資料表和暫存資料表不支援 ALTER DISTSTYLE EVEN 命令。

  • 如果先前將分配樣式定義為 AUTO,則表不再是自動表優化的候選項。

如需 DISTSTYLE EVEN 的詳細資訊,請參閱 CREATE TABLE

ALTER DISTKEY column_name 或 ALTER DISTSTYLE KEY DISTKEY column_name

會變更用作資料表的分佈索引鍵的資料欄的子句。考慮下列各項:

  • VACUUM 和 ALTER DISTKEY 無法並行在相同資料表上執行。

    • 如果 VACUUM 已在執行,則 ALTER DISTKEY 會傳回錯誤。

    • 如果 ALTER DISTKEY 執行中,則不會在資料表上啟動背景清空。

    • 如果 ALTER DISTKEY 執行中,則前景清空會傳回錯誤。

  • 您一次僅可以在一個資料表上執行一個 ALTER DISTKEY 命令。

  • 包含交錯排序索引鍵的資料表不支援 ALTER DISTKEY 命令。

  • 如果先前將分配樣式定義為 AUTO,則表不再是自動表優化的候選項。

指定 DISTSTYLE KEY 時,資料是依 DISTKEY 資料欄中的值分佈。如需 DISTSTYLE 的詳細資訊,請參閱 CREATE TABLE

變更仿舊風格自動

將資料表的現有分佈樣式變更為 AUTO 的子句。

將分配樣式更改為 AUTO 時,表的分佈樣式將設置為以下內容:

  • 一個帶有迪斯風格全部的小桌子被轉換為自動 (全部)。

  • 一個帶有迪斯特風格偶數的小桌子被轉換為自動 (全部)。

  • 帶有迪斯特風格密鑰的小桌子轉換為自動(全部)。

  • 一個帶有迪斯特風格全部的大桌子被轉換為自動(偶數)。

  • 一個帶有迪斯特風格偶數的大桌子被轉換為自動 (EVEN)。

  • 帶有迪斯特風格密鑰的大桌子被轉換為自動 (KEY),並保留了迪斯基。

如果 Amazon Redshift 確定新的分配方式或密鑰將提高查詢的性能,則 Amazon Redshift 將 future 可能會更改您表的分配風格或密鑰。

如需 DISTSTSTYLE 自動的詳細資訊,請參CREATE TABLE

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

ALTER [COMPOUND] SORTKEY ( column_name [,...] )

此子句可變更或新增用於資料表的排序索引鍵。

當您變更排序索引鍵時,新排序索引鍵或原始排序索引鍵中欄的壓縮編碼可能會變更。如果未明確定義表格編碼,Amazon Redshift 會自動指定壓縮編碼,如下所示:

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

  • 定義為 BOOLEAN、REAL 或 DOUBLE PRECISION 資料類型的資料欄會有指派的 RAW 壓縮。

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

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

考慮下列各項:

  • 每個資料表的排序索引鍵最多可定義 400 個資料欄。

  • 您可以將交錯排序鍵更改為複合排序鍵或不使用排序鍵。但是,您不能將複合排序鍵更改為交錯排序鍵。

  • 如果以前將排序鍵定義為 AUTO,則表不再是自動表優化的候選項。

  • Amazon Redshift 建議對定義為排序鍵的列使用 RAW 編碼(無壓縮)。當您更改列以選擇它作為排序鍵時,該列的壓縮將更改為 RAW 壓縮(無壓縮)。這會增加資料表所需的儲存量。表大小增加的程度取決於特定的表定義和表格內容。如需壓縮的詳細資訊,請參壓縮編碼

當資料載入資料表之後,資料就會依據排序索引鍵的排序載入。當您更改排序鍵時,Amazon Redshift 會重新排列資料。如需 SORTKEY 的詳細資訊,請參閱CREATE TABLE

變更分類資料庫自動

將目標資料表的排序鍵變更或添加至 AUTO 的子句。

當您將排序鍵更改為 AUTO 時,Amazon Redshift 會保留表的現有排序鍵。

如果 Amazon Redshift 確定新的排序鍵將提高查詢的性能,則 Amazon Redshift 將 future 可能會更改您的表的排序鍵。

如需 SORTKEY 自動的詳細資訊,請參CREATE TABLE

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

變更分類資料庫無

移除目標資料表排序鍵的子句。

如果以前將排序鍵定義為 AUTO,則表不再是自動表優化的候選項。

ALTER EW 編碼

將目標表列的編碼類型更改為 AUTO 的子句。將編碼更改為 AUTO 時,Amazon Redshift 會保留表中列的現有編碼類型。然後,如果 Amazon Redshift 確定新的編碼類型可以提高查詢性能,則 Amazon Redshift 可以更改表列的編碼類型。

如果您更改一個或多列以指定編碼,Amazon Redshift 將不再自動調整表中所有列的編碼。這些列保留當前編碼設置。

以下操作不會影響表的編碼自動設置:

  • 重命名表。

  • 更改表格的迪斯特風格或分類鍵設置。

  • 使用編碼設置添加或刪除列。

  • 使用「複製」命令的「複合更新」選項。如需詳細資訊,請參閱 資料載入操作

若要檢視資料表的編碼,請查詢 SVV_TABLE_INFO 系統目錄檢視。如需詳細資訊,請參閱 SVV_TABLE_INFO

RENAME COLUMN column_name TO new_name

此子句會將資料欄重新命名為 new_name 中指定的值。資料欄名稱長度上限為 127 個位元組;超過此長度的名稱會截斷至 127 個位元組。如需有效名稱的詳細資訊,請參閱 名稱與識別符

ADD [ COLUMN ] column_name

將指定名稱的資料欄新增至資料表的子句。您只能在每個 ALTER TABLE 陳述式中新增一個資料欄。

您無法新增本身為資料表的分佈索引鍵 (DISTKEY) 或排序索引鍵 (SORTKEY) 的資料欄。

您無法使用 ALTER TABLE ADD COLUMN 命令修改以下資料表和資料欄屬性:

  • UNIQUE

  • PRIMARY KEY

  • REFERENCES (外部索引鍵)

  • IDENTITY 或 GENERATED BY DEFAULT AS IDENTITY

資料欄名稱長度上限為 127 個位元組;超過此長度的名稱會截斷至 127 個位元組。單一資料表中可定義的資料欄數目上限為 1,600 個。

以下限制適用於新增資料欄至外部資料表時:

  • 您無法將資料欄新增至具有資料欄限制條件 DEFAULT、ENCODE、NOT NULL 或 NULL 的外部資料表。

  • 您無法將資料欄新增至使用 AVRO 檔案格式定義的外部資料表。

  • 若啟用虛擬資料欄,則單一外部資料表中可定義的資料欄數目上限為 1,598 個。若未啟用虛擬資料欄,則單一資料表中可定義的資料欄數目上限為 1,600 個。

如需詳細資訊,請參閱 CREATE EXTERNAL TABLE

column_type

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

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

DEFAULT default_expr

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

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

若 COPY 操作在資料欄上遇到有 DEFAULT 值和 NOT NULL 限制條件的 null 欄位,則 COPY 命令會插入 default_expr 的值。

外部資料表不支援 DEFAULT。

ENCODE encoding

資料欄的壓縮編碼。默認情況下,如果您未為表中的任何列指定壓縮編碼,或者您為表指定了 ENCODE AUTO 選項,Amazon Redshift 會自動管理表中所有列的壓縮編碼。

如果您為表中的任何列指定壓縮編碼,或者您沒有為表指定 ENCODE AUTO 選項,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

外部資料表不支援 ENCODE。

NOT NULL | NULL

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

外部資料表不支援 NOT NULL 和 NULL。

DROP [ COLUMN ] column_name

要從資料表中刪除的資料欄名稱。

您無法刪除資料表中的最後一個資料欄。資料表至少必須有一個資料欄。

您無法刪除本身為資料表的分佈索引鍵 (DISTKEY) 或排序索引鍵 (SORTKEY) 的資料欄。若資料欄有任何相依物件,像是檢視、主索引鍵、外部索引鍵或 UNIQUE 限制條件,則 DROP COLUMN 的預設行為是 RESTRICT。

以下限制適用於從外部資料表刪除資料欄時:

  • 若資料欄做為分割區使用,則無法從外部資料表刪除該資料欄。

  • 您無法從使用 AVRO 檔案格式定義的外部資料表中刪除資料欄。

  • 外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。

如需詳細資訊,請參閱 CREATE EXTERNAL TABLE

RESTRICT

搭配 DROP COLUMN 使用時,RESTRICT 表示要捨棄的資料欄未捨棄,在以下這些情況中:

  • 如果定義的檢視參考要捨棄的資料欄

  • 如果外部索引鍵參考資料欄

  • 如果資料欄為分段索引鍵的一部分

RESTRICT 不能搭配 CASCADE 使用。

外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。

CASCADE

搭配 DROP COLUMN 使用時,會移除指定的資料欄及相依於該資料欄的任何項目。CASCADE 不能搭配 RESTRICT 使用。

外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。

以下選項只適用於外部資料表。

SET LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }

包含資料檔案的 Amazon S3 檔案夾路徑,或包含 Amazon S3 物件路徑清單的資訊清單檔案。儲存桶必須位於相同的AWS區域為 Amazon Redshift 叢集。如需支援的清單AWS區域,請參閲Amazon Redshift Spectrum 注意事項。如需使用資訊清單檔案的詳細資訊,請參閱 CREATE EXTERNAL TABLE 參數 參考中的 LOCATION。

SET FILE FORMAT format

外部資料檔案的檔案格式。

有效格式如下:

  • AVRO

  • PARQUET

  • RCFILE

  • SEQUENCEFILE

  • TEXTFILE

SET TABLE PROPERTIES ( 'property_name'='property_value')

此子句會設定外部資料表的資料表屬性的資料表定義。

注意

資料表屬性區分大小寫。

'numRows'='row_count'

此屬性會設定資料表定義的 numRows 值。若要明確更新外部資料表的統計資訊,請設定 numRows 屬性以指出資料表的大小。Amazon Redshift 不會分析外部資料表來產生資料表統計資訊 (該統計資訊可供查詢最佳化工具用來產生查詢計畫)。如果未設定外部資料表的資料表統計資料,Amazon Redshift 會產生查詢執行計畫。此計畫是根據外部資料表為較大資料表,而本機資料表為較小資料表的假設。

'skip.header.line.count'='line_count'

此屬性會設定每個來源檔案開頭要略過的資料列數。

PARTITION ( partition_column=partition_value [, ...] SET LOCATION { 's3://bucket/folder' | 's3://bucket/manifest_file' }

此子句會設定一個或多個分割區資料欄的新位置。

ADD [ IF NOT EXISTS ] PARTITION ( partition_column=partition_value [, ...] ) LOCATION { 's3://bucket/folder' | 's3://bucket/manifest_file' } [, ... ]

新增一或多個分割區的子句。您可以使用單一 ALTER TABLE … ADD 陳述式來指定多個 PARTITION 子句。

注意

如果您使用 AWS Glue 目錄,則可以使用 ALTER TABLE 陳述式新增最多 100 個分割區。

IF NOT EXISTS 子句指出,若指定的分割區已存在,則命令不應進行任何變更。也指出命令應該傳回分割區已存在的訊息,而不是在發生錯誤的情況下終止。此子句在編寫指令碼時很實用,如此指令碼就不會因為 ALTER TABLE 嘗試新增已存在的分割區而失敗。

DROP PARTITION (partition_column=partition_value [, ...] )

刪除指定分割區的子句。刪除分割區只會修改外部資料表中繼資料。Amazon S3 上的資料不受影響。