

 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/)。

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

# ALTER TABLE
<a name="r_ALTER_TABLE"></a>

此命令會變更 Amazon Redshift 資料表或 Amazon Redshift Spectrum 外部資料表的定義。此命令會更新 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 或 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 設定的值和屬性。您可以在檢視上使用 ALTER TABLE 以提供資料列層級安全 (RLS)。

您不能在交易區塊 (BEGIN ... END) 內的外部資料表上執行 ALTER TABLE。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

ALTER TABLE 會鎖定用於讀取和寫入操作的資料表，直到封閉 ALTER TABLE 操作的交易完成為止，除非在文件中明確說明您可以在修改資料表時，查詢資料或對資料表執行其他操作。

## 所需權限
<a name="r_ALTER_TABLE-privileges"></a>

修改資料表的使用者需要適當的權限，才能成功執行命令。根據 ALTER TABLE 命令的不同，使用者可能需要下列其中一項權限。
+ 超級使用者
+ 具有 ALTER TABLE 權限的使用者
+ 具有結構描述的 USAGE 權限的資料表擁有者

## 語法
<a name="r_ALTER_TABLE-synopsis"></a>

```
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 updated_varchar_data_type_size
| 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 ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ] |
| DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] 
| ROW LEVEL SECURITY { ON | OFF } [ CONJUNCTION TYPE { AND | OR } ] [ FOR DATASHARES ]
| MASKING { ON | OFF } FOR DATASHARES }

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);
```

## Parameters
<a name="r_ALTER_TABLE-parameters"></a>

 *table\$1name*   
要修改的資料表名稱。僅指定資料表的名稱，或使用格式 *schema\$1name.table\$1name* 來使用專屬結構描述。外部資料表必須以外部結構描述名稱限定。如果您要使用 ALTER TABLE 陳述式重新命名檢視或變更其擁有者，則也可以指定檢視名稱。資料表名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

ADD *table\$1constraint*   
新增指定限制條件至資料表的子句。如需有效 *table\$1constraint* 值得說明，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。  
您無法將主索引鍵限制條件新增至可為 null 的資料欄。如果資料欄原本是以 NOT NULL 限制條件建立，則您可以新增主索引鍵限制條件。

DROP CONSTRAINT *constraint\$1name*   
從資料表中刪除具名限制條件的子句。若要刪除限制條件，請指定限制條件名稱，而非限制條件類型。若要檢視資料表限制條件名稱，請執行下列查詢。  

```
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\$1owner*   
此子句會將資料表 (或檢視) 的擁有者變更為 *new\$1owner* 值。

RENAME TO *new\$1name*   
此子句會將資料表 (或檢視) 重新命名為 *new\$1name* 中指定的值。資料表名稱長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。  
您無法將永久資料表重新命名為開頭為 '\$1' 的名稱。開頭為 '\$1' 的資料表名稱代表暫時資料表。  
您無法重新命名外部資料表。

ALTER COLUMN *column\$1name* TYPE *updated\$1varchar\$1data\$1type\$1size*   
子句，會變更定義為 VARCHAR 資料類型的資料欄大小。此子句僅支援修改 VARCHAR 資料類型的大小。考量下列限制：  
+ 您無法修改具有以下壓縮編碼的欄位：BYTEDICT、RUNLENGTH、TEXT255 或 TEXT32K。
+ 您無法將大小降低至小於現有資料的大小上限。
+ 您無法修改含預設值的資料欄。
+ 您無法修改具有 UNIQUE、PRIMARY KEY 或 FOREIGN KEY 的資料欄。
+ 您無法在交易區塊 (BEGIN ... END) 內改變資料欄。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

ALTER COLUMN *column\$1name* ENCODE *new\$1encode\$1type*   
變更資料欄壓縮編碼的子句。如果您指定資料欄的壓縮編碼，資料表就不會再設定為 ENCODE AUTO。如需壓縮編碼的詳細資訊，請參閱 [欄壓縮以縮減儲存資料的大小](t_Compressing_data_on_disk.md)。  
當您變更資料欄的壓縮編碼時，資料表仍可供查詢。  
考量下列限制：  
+ 您無法將資料欄的編碼修改為目前資料行定義的編碼。
+ 您無法在具有交錯排序索引鍵的資料表中修改資料行的編碼。

ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, .....;  
該子句可變更單一命令中多個資料欄的壓縮編碼。如需壓縮編碼的詳細資訊，請參閱 [欄壓縮以縮減儲存資料的大小](t_Compressing_data_on_disk.md)。  
當您變更資料欄的壓縮編碼時，資料表仍可供查詢。  
 考量下列限制：  
+ 您無法在單一命令中多次將資料欄變更為相同或不同的編碼類型。
+ 您無法將資料欄的編碼修改為目前資料行定義的編碼。
+ 您無法在具有交錯排序索引鍵的資料表中修改資料行的編碼。

ALTER DISTSTYLE ALL  
將資料表的現有分佈樣式變更為 `ALL` 的子句。考慮下列各項：  
+ 無法同時在相同資料表上執行 ALTER DISTSTYLE、ALTER SORTKEY 和 VACUUM。
  + 如果 VACUUM 目前執行中，然後執行 ALTER DISTSTYLE ALL 會傳回錯誤。
  + 如果 ALTER DISTSTYLE ALL 執行中，則不會在資料表上啟動背景清空。
+ 包含交錯排序索引鍵的資料表和暫存資料表不支援 ALTER DISTSTYLE ALL 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
如需 DISTSTYLE ALL 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER DISTSTYLE EVEN  
將資料表的現有分佈樣式變更為 `EVEN` 的子句。考慮下列各項：  
+ 無法同時在相同資料表上執行 ALTER DISTSYTLE、ALTER SORTKEY 和 VACUUM。
  + 如果 VACUUM 目前執行中，然後執行 ALTER DISTSTYLE EVEN 會傳回錯誤。
  + 如果 ALTER DISTSTYLE EVEN 執行中，則不會在資料表上啟動背景清空。
+ 包含交錯排序索引鍵的資料表和暫存資料表不支援 ALTER DISTSTYLE EVEN 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
如需 DISTSTYLE EVEN 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER DISTKEY *column\$1name* 或 ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
會變更用作資料表的分佈索引鍵的資料欄的子句。考慮下列各項：  
+ VACUUM 和 ALTER DISTKEY 無法並行在相同資料表上執行。
  + 如果 VACUUM 已在執行，則 ALTER DISTKEY 會傳回錯誤。
  + 如果 ALTER DISTKEY 執行中，則不會在資料表上啟動背景清空。
  + 如果 ALTER DISTKEY 執行中，則前景清空會傳回錯誤。
+ 您一次僅可以在一個資料表上執行一個 ALTER DISTKEY 命令。
+ 包含交錯排序索引鍵的資料表不支援 ALTER DISTKEY 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
指定 DISTSTYLE KEY 時，資料是依 DISTKEY 資料欄中的值分佈。如需 DISTSTYLE 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER DISTSTYLE AUTO  
將資料表的現有分佈樣式變更為 AUTO 的子句。  
將分佈樣式變更為 AUTO 時，資料表的分佈樣式會設定為下列內容：  
+ 將具有 DISTSTYLE ALL 的小型資料表轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE EVEN 的小型資料表轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE KEY 的小型資料表轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE ALL 的大型資料表轉換為 AUTO(EVEN)。
+ 將具有 DISTSTYLE EVEN 的大型資料表轉換為 AUTO(EVEN)。
+ 將具有 DISTSTYLE KEY 的大型資料表轉換為 AUTO(KEY) 並保留 DISTKEY 。在這種情況下，Amazon Redshift 不會對資料表進行任何變更。
如果 Amazon Redshift 判斷新的分佈樣式或索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在未來變更資料表的分佈樣式或索引鍵。例如，Amazon Redshift 可能會將 DISTSTYLE 為 AUTO(KEY) 的資料表轉換為 AUTO(EVEN)，反之亦然。如需修改分佈索引鍵時行為 (包括資料重新分佈和鎖定) 的相關資訊，請參閱 [Amazon Redshift Advisor 建議](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation)。  
如需 DISTSTYLE AUTO 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。  
若要檢視資料表的分佈樣式，請查詢 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)。

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
此子句可變更或新增用於資料表的排序索引鍵。暫存資料表不支援 ALTER SORTKEY。  
當您變更排序索引鍵時，新排序索引鍵或原始排序索引鍵中欄的壓縮編碼可能會變更。如果沒有明確定義資料表的編碼，則 Amazon Redshift 會自動指定壓縮編碼，如下所示：  
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL 或 DOUBLE PRECISION 資料類型的資料欄會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR 或 VARCHAR 的資料欄會有指派的 LZO 壓縮。
考慮下列各項：  
+ 每個資料表的排序索引鍵最多可定義 400 個資料欄。
+ 您可以將交錯排序索引鍵修改為複合排序索引鍵或無排序索引鍵。但是，您無法將複合排序索引鍵修改為交錯排序索引鍵。
+ 如果排序索引鍵先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
+ Amazon Redshift 建議對定義為排序索引鍵的資料欄使用 RAW 編碼 (不壓縮)。當您變更資料欄以選擇其做為排序索引鍵時，資料欄的壓縮會變更為 RAW 壓縮 (不壓縮)。這可能會增加資料表所需的儲存空間。資料表大小的增加幅度取決於特定的資料表定義和資料表內容。如需壓縮的相關資訊，請參閱 [壓縮編碼](c_Compression_encodings.md)。
當資料載入資料表之後，資料就會依據排序索引鍵的排序載入。當您修改排序索引鍵時，Amazon Redshift 會重新排列資料。如需 SORTKEY 的相關資訊，請參閱[CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER SORTKEY AUTO  
將目標資料表的排序索引鍵變更或新增為 AUTO 的子句。暫存資料表不支援 SORTKEY AUTO。  
當您將排序索引鍵修改為 AUTO 時，Amazon Redshift 會保留資料表的現有排序索引鍵。  
如果 Amazon Redshift 判斷新的排序索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在未來變更資料表的排序索引鍵。  
如需 SORTKEY AUTO 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。  
若要檢視資料表的排序索引鍵，請查詢 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)。

ALTER SORTKEY NONE  
移除目標資料表的排序索引鍵的子句。  
如果排序索引鍵先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。

ALTER ENCODE AUTO  
將目標資料表資料欄的編碼類型變更為 AUTO 的子句。當您將編碼修改為 AUTO 時，Amazon Redshift 會保留資料表中資料欄的現有編碼類型。然後，如果 Amazon Redshift 判斷新的編碼類型可以改善查詢效能，Amazon Redshift 就可以變更資料表資料欄的編碼類型。  
如果您修改一個或多個欄以指定編碼，則 Amazon Redshift 不會再自動調整資料表中所有資料欄的編碼。這些資料欄會保留目前的編碼設定。  
下列動作不會影響資料表的 ENCODE AUTO 設定：  
+ 重新命名資料表。
+ 修改資料表的 DISTSTYLE 或 SORTKEY 設定。
+ 使用 ENCODE 設定新增或捨棄資料列。
+ 使用 COPY 命令的 COMPUPDATE 選項。如需詳細資訊，請參閱[資料載入操作](copy-parameters-data-load.md)。
若要檢視資料表的編碼，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。

RENAME COLUMN *column\$1name* TO *new\$1name*   
此子句會將資料欄重新命名為 *new\$1name* 中指定的值。資料欄名稱長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

ADD [ COLUMN ] *column\$1name*   
將指定名稱的資料欄新增至資料表的子句。您只能在每個 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](r_CREATE_EXTERNAL_TABLE.md)。

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

DEFAULT *default\$1expr*   <a name="alter-table-default"></a>
此子句會指派資料欄的預設資料值。*default\$1expr* 的資料類型必須符合資料欄的資料類型。DEFAULT 值必須是無變數的表達式。不允許子查詢、目前資料表中其他資料欄的交叉參考，以及使用者定義的功能。  
*default\$1expr* 是在未指定資料欄值的任何 INSERT 操作中使用。若未指定預設值，則資料欄的預設值為 null。  
若 COPY 操作在資料欄上遇到有 DEFAULT 值和 NOT NULL 限制條件的 null 欄位，則 COPY 命令會插入 *default\$1expr* 的值。  
外部資料表不支援 DEFAULT。

ENCODE *encoding*   
資料欄的壓縮編碼。根據預設，如果您未為資料表中的任何資料欄指定壓縮編碼，或者您指定資料表的 ENCODE AUTO 選項，Amazon Redshift 會自動管理資料表中所有資料欄的壓縮編碼。  
如果您為資料表中的任何資料欄指定壓縮編碼，或者未為資料表指定 ENCODE AUTO 選項，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
外部資料表不支援 ENCODE。

NOT NULL \$1 NULL   
NOT NULL 會指定不允許資料欄包含 null 值。NULL 是預設值，指出資料欄可接受 null 值。  
外部資料表不支援 NOT NULL 和 NULL。

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
指定資料欄上的字串搜尋或比較是區分大小寫或不區分大小寫的子句。預設值與資料庫目前的區分大小寫設定相同。  
若要尋找資料庫定序資訊，請使用下列命令：  

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

DROP [ COLUMN ] *column\$1name*   
要從資料表中刪除的資料欄名稱。  
您無法刪除資料表中的最後一個資料欄。資料表至少必須有一個資料欄。  
您無法刪除本身為資料表的分佈索引鍵 (DISTKEY) 或排序索引鍵 (SORTKEY) 的資料欄。若資料欄有任何相依物件，像是檢視、主索引鍵、外部索引鍵或 UNIQUE 限制條件，則 DROP COLUMN 的預設行為是 RESTRICT。  
以下限制適用於從外部資料表刪除資料欄時：  
+ 若資料欄做為分割區使用，則無法從外部資料表刪除該資料欄。
+ 您無法從使用 AVRO 檔案格式定義的外部資料表中刪除資料欄。
+ 外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。
+ 除非您將政策捨棄或中斷連結，否則您無法捨棄政策定義中參照的政策資料表資料欄。這也適用於指定 CASCADE 選項時。您可以捨棄政策資料表中的其他資料欄。
如需詳細資訊，請參閱[CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)。

RESTRICT   
搭配 DROP COLUMN 使用時，RESTRICT 表示要捨棄的資料欄未捨棄，在以下這些情況中：  
+ 如果定義的檢視參考要捨棄的資料欄
+ 如果外部索引鍵參考資料欄
+ 如果資料欄為分段索引鍵的一部分
RESTRICT 不能搭配 CASCADE 使用。  
外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。

CASCADE   
搭配 DROP COLUMN 使用時，會移除指定的資料欄及相依於該資料欄的任何項目。CASCADE 不能搭配 RESTRICT 使用。  
外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。

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

SET LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*' \$1  
包含資料檔案的 Amazon S3 資料夾路徑，或包含 Amazon S3 物件路徑清單的資訊清單檔案。儲存貯體必須位於 Amazon Redshift 叢集所在的同一 AWS 區域。如需支援的 AWS 區域清單，請參閱 [Amazon Redshift Spectrum 限制](c-spectrum-considerations.md)。如需使用資訊清單檔案的相關資訊，請參閱 CREATE EXTERNAL TABLE [Parameters](r_CREATE_EXTERNAL_TABLE.md#r_CREATE_EXTERNAL_TABLE-parameters) 參考中的 LOCATION。

SET FILE FORMAT *format*  
外部資料檔案的檔案格式。  
有效格式如下：  
+ AVRO 
+ PARQUET
+ RCFILE
+ SEQUENCEFILE
+ TEXTFILE 

SET TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*')   
此子句會設定外部資料表的資料表屬性的資料表定義。  
資料表屬性區分大小寫。  
'numRows'='*row\$1count*'  
此屬性會設定資料表定義的 numRows 值。若要明確更新外部資料表的統計資料，請設定 numRows 屬性以指出資料表的大小。Amazon Redshift 不會分析外部資料表來產生查詢最佳化工具用來產生查詢計劃的資料表統計資料。如果未設定外部資料表的資料表統計資料，則 Amazon Redshift 會產生查詢執行計畫。此計畫是根據外部資料表為較大資料表，而本機資料表為較小資料表的假設。  
'skip.header.line.count'='*line\$1count*'  
此屬性會設定每個來源檔案開頭要略過的資料列數。

PARTITION ( *partition\$1column*=*partition\$1value* [, ...] SET LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1  
此子句會設定一個或多個分割區資料欄的新位置。

ADD [ IF NOT EXISTS ] PARTITION ( *partition\$1column*=*partition\$1value* [, ...] ) LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1 [, ... ]  
新增一或多個分割區的子句。您可以使用單一 ALTER TABLE … ADD 陳述式來指定多個 PARTITION 子句。  
如果您使用 AWS Glue 目錄，您可以使用單一 ALTER TABLE 陳述式新增最多 100 個分割區。
IF NOT EXISTS 子句指出，若指定的分割區已存在，則命令不應進行任何變更。也指出命令應該傳回分割區已存在的訊息，而不是在發生錯誤的情況下終止。此子句在編寫指令碼時很實用，如此指令碼就不會因為 ALTER TABLE 嘗試新增已存在的分割區而失敗。

DROP PARTITION (*partition\$1column*=*partition\$1value* [, ...] )   
刪除指定分割區的子句。刪除分割區只會修改外部資料表中繼資料。Amazon S3 上的資料不受影響。

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
開啟或關閉關係的資料列層級安全性的子句。  
開啟關係的資料列層級安全性時，您只能讀取資料列層級安全政策允許您存取的資料列。如果沒有任何政策授予您關係存取權，您就無法看到關聯中的任何資料列。只有超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以設定 ROW LEVEL SECURITY 子句。如需詳細資訊，請參閱[資料列層級安全性](t_rls.md)。連線的資料庫或具有 amazon redshift 聯合許可的資料庫支援此陳述式。FOR DATASHARES 子句不支援具有 Amazon Redshift 聯合許可的資料庫。  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  一個子句，讓您為關係選擇資料列層級安全政策的結合類型。將多個資料列層級安全政策附加至關係時，您可以將政策與 AND 或 OR 子句結合使用。根據預設，Amazon Redshift 將 RLS 政策與 AND 子句結合在一起。具有 `sys:secadmin` 角色的超級使用者、使用者或角色可以使用此子句來定義關係之資料列層級安全政策的組合類型。如需詳細資訊，請參閱[每個使用者結合多個政策](t_rls_combine_policies.md)。
+ FOR DATASHARES

  該子句會決定是否可透過資料共用存取受 RLS 保護的關係。預設的情況是無法透過資料共用存取受 RLS 保護的關係。搭配此子句執行的 ALTER TABLE ROW LEVEL SECURITY 命令只會影響關係的資料共用存取屬性。ROW LEVEL SECURITY 屬性並未變更。

   如果您讓受 RLS 保護的關係可以透過資料庫存取，則該關係在取用者端資料庫中不會有資料列層級的安全性。關係會在生產者端保留其 RLS 屬性。

MASKING \$1 ON \$1 OFF \$1 FOR DATASHARES  
該子句會決定是否可透過資料共用存取受 DDM 保護的關係。根據預設，無法透過資料共用存取受 DDM 保護的關係。如果您開放透過資料共用存取受 DDM 保護的關係，則該關係在取用者端資料共用的資料庫中不會受到遮罩保護。關係會保留其在生產者端的遮罩屬性。只有超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以設定 MASKING FOR DATASHARES 子句。如需詳細資訊，請參閱[動態資料遮罩](t_ddm.md)。

## 範例
<a name="r_ALTER_TABLE-examples"></a>

如需示範如何使用 ALTER TABLE 命令的範例，請參閱下列內容。
+ [ALTER TABLE 範例](r_ALTER_TABLE_examples_basic.md)
+ [ALTER EXTERNAL TABLE 範例](r_ALTER_TABLE_external-table.md)
+ [ALTER TABLE ADD 和 DROP COLUMN 範例](r_ALTER_TABLE_COL_ex-add-drop.md)

# ALTER TABLE 範例
<a name="r_ALTER_TABLE_examples_basic"></a>

以下範例示範 ALTER TABLE 命令的基本用法。

## 重新命名資料表或檢視
<a name="r_ALTER_TABLE_examples_basic-rename-a-table"></a>

以下命令會將 USERS 資料表重新命名為 USERS\$1BKUP：

```
alter table users
rename to users_bkup;
```

 您也可以使用此類型的命令來重新命名檢視。

## 變更資料表或檢視的擁有者
<a name="r_ALTER_TABLE_examples_basic-change-the-owner-of-a-table-or-view"></a>

以下命令會將 VENUE 資料表擁有者變更為使用者 DWUSER：

```
alter table venue
owner to dwuser;
```

以下命令會建立檢視，然後變更其擁有者：

```
create view vdate as select * from date;
alter table vdate owner to vuser;
```

## 重新命名欄位
<a name="r_ALTER_TABLE_examples_basic-rename-a-column"></a>

以下命令會將 VENUE 資料表中的 VENUESEATS 資料欄重新命名為 VENUESIZE：

```
alter table venue
rename column venueseats to venuesize;
```

## 丟棄資料表限制條件
<a name="r_ALTER_TABLE_examples_drop-constraint"></a>

若要捨棄資料表限制條件，像是主索引鍵、外部索引鍵或唯一限制條件，請先找到限制條件的內部名稱。然後在 ALTER TABLE 命令中指定限制條件名稱。以下範例會尋找 CATEGORY 資料表的限制條件，然後刪除名稱為 `category_pkey` 的主索引鍵。

```
select constraint_name, constraint_type
from information_schema.table_constraints
where constraint_schema ='public'
and table_name = 'category';

constraint_name | constraint_type
----------------+----------------
category_pkey   | PRIMARY KEY

alter table category
drop constraint category_pkey;
```

## 變更 VARCHAR 資料欄
<a name="r_ALTER_TABLE_examples_alter-column"></a>

若要節省儲存體，您可以定義一個資料表，其中的 VARCHAR 資料欄一開始具有您目前資料需求所需的最低大小。之後若要容納較長的字串，則可以變更資料表以增加資料欄的大小。

以下範例會將 EVENTNAME 資料欄的大小增加為 VARCHAR (300)。

```
alter table event alter column eventname type varchar(300);
```

## 更改 VARBYTE 欄
<a name="r_ALTER_TABLE_examples_alter-varbyte-column"></a>

若要節省儲存體，您可以定義一個資料表，其中的 VARBYTE 欄一開始具有您目前資料需求所需的最低大小。之後若要容納較長的字串，則可以變更資料表以增加資料欄的大小。

以下範例會將 EVENTNAME 欄的大小增加為 VARBYTE(300)。

```
alter table event alter column eventname type varbyte(300);
```

## 修改資料欄的壓縮編碼。
<a name="r_ALTER_TABLE_examples_alter-column-encoding"></a>

您可以修改資料欄的壓縮編碼。您可以在下方找到一組示範此方法的範例。這些範例的資料表定義如下。

```
create table t1(c0 int encode lzo, c1 bigint encode zstd, c2 varchar(16) encode lzo, c3 varchar(32) encode zstd);
```

下列陳述式會將資料欄 c0 的壓縮編碼從 LZO 編碼修改為 AZ64 編碼。

```
alter table t1 alter column c0 encode az64;
```

下列陳述式會將資料欄 c1 的壓縮編碼從 Zstandard 編碼修改為 AZ64 編碼。

```
alter table t1 alter column c1 encode az64;
```

下列陳述式會將資料欄 c2 的壓縮編碼從 LZO 編碼修改為 Byte-Dictionary 編碼。

```
alter table t1 alter column c2 encode bytedict;
```

下列陳述式會將資料欄 c3 的壓縮編碼從 Zstandard 編碼修改為 Runlength 編碼。

```
alter table t1 alter column c3 encode runlength;
```

## 修改 DISTSTYLE KEY DISTKEY 欄位
<a name="r_ALTER_TABLE_examples_alter-distkey"></a>

下列範例示範如何變更資料表的 DISTSTYLE 和 DISTKEY。

建立採用 EVEN 分佈樣式的資料表。SVV\$1TABLE\$1INFO 檢視顯示 DISTSTYLE 為 EVEN。

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

將資料表 DISTKEY 改為 `inv_warehouse_sk`。SVV\$1TABLE\$1INFO 檢視將 `inv_warehouse_sk` 資料欄顯示為產生的分佈金鑰。

```
alter table inventory alter diststyle key distkey inv_warehouse_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_warehouse_sk)
```

將資料表 DISTKEY 改為 `inv_item_sk`。SVV\$1TABLE\$1INFO 檢視將 `inv_item_sk` 資料欄顯示為產生的分佈金鑰。

```
alter table inventory alter distkey inv_item_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_item_sk)
```

## 將資料表改為 DISTSTYLE ALL
<a name="r_ALTER_TABLE_examples_alter-diststyle-all"></a>

下列範例示範如何將資料表變更為 DISTSTYLE ALL。

建立採用 EVEN 分佈樣式的資料表。SVV\$1TABLE\$1INFO 檢視顯示 DISTSTYLE 為 EVEN。

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

將資料表 DISTSTYLE 改為 ALL。SVV\$1TABLE\$1INFO 檢視會顯示已變更的 DISTSYTLE。

```
alter table inventory alter diststyle all;

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     ALL
```

## 修改資料表 SORTKEY
<a name="r_ALTER_TABLE_examples_alter-sortkey"></a>

您可以修改資料表以具有複合排序索引鍵或沒有排序鍵。

在下列資料表定義中，資料表 `t1` 是以交錯排序索引鍵來定義。

```
create table t1 (c0 int, c1 int) interleaved sortkey(c0, c1);
```

下列命令會將資料表從交錯排序索引鍵修改為複合排序索引鍵。

```
alter table t1 alter sortkey(c0, c1);
```

下列命令會修改資料表以移除交錯排序索引鍵。

```
alter table t1 alter sortkey none;
```

在下列資料表定義中，資料表 `t1` 是以 `c0` 作為交錯排序索引鍵來定義。

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

下列命令會將資料表 `t1` 修改為複合排序索引鍵。

```
alter table t1 alter sortkey(c0, c1);
```

## 將資料表修改為 ENCODE AUTO
<a name="r_ALTER_TABLE_examples_alter-encode-auto"></a>

下列範例顯示如何將資料表修改為 ENCODE AUTO。

此範例的資料表定義如下。資料欄 `c0` 是以編碼類型 AZ64 定義，而資料欄 `c1` 是以編碼類型 LZO 定義。

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

對於此資料表，下列陳述式會將編碼變更為 AUTO。

```
alter table t1 alter encode auto;
```

下列範例會顯示如何將資料表修改為移除 ENCODE AUTO 設定。

此範例的資料表定義如下。資料表資料欄不需編碼即可定義。在這種情況下，編碼會預設為 ENCODE AUTO。

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

對於此資料表，下列陳述式會將資料欄 c0 的編碼變更為 LZO。資料表編碼不再設定為 ENCODE AUTO。

```
alter table t2 alter column c0 encode lzo;;
```

## 修改資料列層級安全性控制
<a name="r_ALTER_TABLE_examples_basic-rls"></a>

下列命令會關閉資料表的 RLS：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY OFF;
```

下列命令會開啟資料表的 RLS：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
```

下列命令會開啟資料表的 RLS，並使其可透過資料共用存取：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES OFF;
```

下列命令會開啟資料表的 RLS，並使其不可透過資料共用存取：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES ON;
```

下列命令會開啟 RLS，並將資料表的 RLS 結合類型設定為 OR：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE OR;
```

下列命令會開啟 RLS，並將資料表的 RLS 結合類型設定為 AND：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE AND;
```

# ALTER EXTERNAL TABLE 範例
<a name="r_ALTER_TABLE_external-table"></a>

下列範例使用位於美國東部 （維吉尼亞北部） 區域 (`us-east-1`) 的 Amazon S3 儲存貯體， AWS 區域 以及在 中[範例](r_CREATE_EXTERNAL_TABLE_examples.md)為 CREATE TABLE 建立的範例資料表。如需如何搭配外部資料表使用分割區的詳細資訊，請參閱 [分割 Redshift Spectrum 外部資料表](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning)。

以下範例會將 SPECTRUM.SALES 外部資料表的 numRows 資料表屬性設定為 170,000 個資料列。

```
alter table spectrum.sales
set table properties ('numRows'='170000');
```

以下範例會變更 SPECTRUM.SALES 外部資料表的位置。

```
alter table spectrum.sales
set location 's3://redshift-downloads/tickit/spectrum/sales/';
```

以下範例會將 SPECTRUM.SALES 外部資料表的格式變更為 Parquet。

```
alter table spectrum.sales
set file format parquet;
```

以下範例會為 SPECTRUM.SALES\$1PART 資料表新增一個分割區。

```
alter table spectrum.sales_part
add if not exists partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/';
```

以下範例會為 SPECTRUM.SALES\$1PART 資料表新增三個分割區。

```
alter table spectrum.sales_part add if not exists
partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/'
partition(saledate='2008-02-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/'
partition(saledate='2008-03-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
```

以下範例會修改 SPECTRUM.SALES\$1PART 以刪除具有 `saledate='2008-01-01''` 的分割區。

```
alter table spectrum.sales_part
drop partition(saledate='2008-01-01');
```

以下範例會為具有 `saledate='2008-01-01'` 的分割區設定新的 Amazon S3 路徑。

```
alter table spectrum.sales_part
partition(saledate='2008-01-01')
set location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01-01/';
```

下列範例會將 `sales_date` 的名稱變更為 `transaction_date`。

```
alter table spectrum.sales rename column sales_date to transaction_date;
```

下列範例會針對使用最佳化資料列單欄式 (ORC) 格式的外部資料表，將資料欄映射設定為位置映射。

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='position');
```

下列範例會針對使用 ORC 格式的外部資料表，將資料欄映射設定為名稱映射。

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='name');
```

# ALTER TABLE ADD 和 DROP COLUMN 範例
<a name="r_ALTER_TABLE_COL_ex-add-drop"></a>

以下範例示範如何使用 ALTER TABLE 先新增再刪除基本資料表資料欄，以及如何刪除具有相依物件的資料欄。

## 先 ADD 再 DROP 基本欄位
<a name="r_ALTER_TABLE_COL_ex-add-then-drop-a-basic-column"></a>

下列範例會將獨立的 FEEDBACK\$1SCORE 資料欄新增至 USERS 資料表。此資料欄僅包含整數，且此資料欄的預設值為 NULL (無意見回饋分數)。

首先，查詢 PG\$1TABLE\$1DEF 目錄資料表以檢視 USERS 資料表的結構描述：

```
column        | type                   | encoding | distkey | sortkey
--------------+------------------------+----------+---------+--------
userid        | integer                | delta    | true    |       1
username      | character(8)           | lzo      | false   |       0
firstname     | character varying(30)  | text32k  | false   |       0
lastname      | character varying(30)  | text32k  | false   |       0
city          | character varying(30)  | text32k  | false   |       0
state         | character(2)           | bytedict | false   |       0
email         | character varying(100) | lzo      | false   |       0
phone         | character(14)          | lzo      | false   |       0
likesports    | boolean                | none     | false   |       0
liketheatre   | boolean                | none     | false   |       0
likeconcerts  | boolean                | none     | false   |       0
likejazz      | boolean                | none     | false   |       0
likeclassical | boolean                | none     | false   |       0
likeopera     | boolean                | none     | false   |       0
likerock      | boolean                | none     | false   |       0
likevegas     | boolean                | none     | false   |       0
likebroadway  | boolean                | none     | false   |       0
likemusicals  | boolean                | none     | false   |       0
```

現在新增 feedback\$1score 資料欄：

```
alter table users
add column feedback_score int
default NULL;
```

從 USERS 選取 FEEDBACK\$1SCORE 資料欄，確認其已新增：

```
select feedback_score from users limit 5;

feedback_score
----------------
NULL
NULL
NULL
NULL
NULL
```

刪除資料欄以恢復原始 DDL：

```
alter table users drop column feedback_score;
```

## 捨棄具有相依物件的欄位
<a name="r_ALTER_TABLE_COL_ex-dropping-a-column-with-a-dependent-object"></a>

下列範例會捨棄具有相依物件的資料欄。結果會將相依物件一併刪除。

首先再次將 FEEDBACK\$1SCORE 資料欄新增至 USERS 資料表：

```
alter table users
add column feedback_score int
default NULL;
```

接著從 USERS 資料表建立名為 USERS\$1VIEW 的檢視：

```
create view users_view as select * from users;
```

現在嘗試從 USERS 資料表刪除 FEEDBACK\$1SCORE 資料欄。此 DROP 陳述式會使用預設行為 (RESTRICT)：

```
alter table users drop column feedback_score;
```

Amazon Redshift 會顯示錯誤訊息，指出無法捨棄資料欄，因為有其他物件與其相依。

再次嘗試刪除 FEEDBACK\$1SCORE 資料欄，這次指定 CASCADE 以刪除所有相依物件：

```
alter table users
drop column feedback_score cascade;
```