

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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/)。

# 更改表定义
<a name="iceberg-alter-table"></a>

`ALTER TABLE` 语句用于更改表定义，包括架构、分区规范和属性。您可以使用这些 DDL 语句直接通过 Amazon Redshift 管理 Iceberg 表。

所有 `ALTER TABLE` 语句都支持对 Iceberg 表使用外部架构引用或三部分表示法引用。在下面的语法示例中，`{{iceberg_table}}` 可以是以下任何一项：

```
-- External schema notation:
{{<external_schema>}}.{{<table_name>}}

-- Three-part notation for S3 table buckets:
"{{<table_bucket_name>}}@s3tablescatalog".{{<database_name>}}.{{<table_name>}}

-- Three-part notation for the awsdatacatalog root catalog:
awsdatacatalog.{{<database_name>}}.{{<table_name>}}
```

有关更多信息，请参阅 [在 Amazon Redshift 中引用 Iceberg 表](referencing-iceberg-tables.md)。

使用 `ALTER TABLE` 语句时，请注意以下事项：
+ `ALTER TABLE` 语句目前仅支持 Iceberg v2 表。
+ 所有 `ALTER TABLE` 语句都是仅限元数据的操作。
+ `ALTER TABLE` 语句不支持包含复杂类型列的表。

**Contents**
+ [ALTER TABLE RENAME COLUMN](#iceberg-alter-table-rename-column)
+ [ALTER TABLE ADD/DROP COLUMN](#iceberg-alter-table-add-drop-column)
+ [ALTER TABLE ALTER COLUMN](#iceberg-alter-table-alter-column)
+ [ALTER TABLE SET TABLE PROPERTIES](#iceberg-alter-table-set-properties)
+ [ALTER TABLE ADD、DROP 和 REPLACE PARTITION FIELD](#iceberg-alter-table-partition-field)

## ALTER TABLE RENAME COLUMN
<a name="iceberg-alter-table-rename-column"></a>

```
ALTER TABLE {{iceberg_table}}
RENAME [COLUMN] {{col_name}} TO {{new_name}};
```

`ALTER TABLE RENAME COLUMN` 重命名现有列。`{{col_name}}` 可以是分区列或非分区列。重命名后，列的数据类型和分区规范不会改变。

**注意**  
AWS Lake Formation 已注册的表不支持 `ALTER TABLE RENAME COLUMN`。

## ALTER TABLE ADD/DROP COLUMN
<a name="iceberg-alter-table-add-drop-column"></a>

```
ALTER TABLE {{iceberg_table}}
ADD [COLUMN] {{col_name}} {{col_type}};
```

```
ALTER TABLE {{iceberg_table}}
DROP [COLUMN] {{col_name}};
```

`ADD COLUMN` 向现有 Iceberg 表添加一列。可以使用 Amazon Redshift Iceberg 写入所支持的任何数据类型。有关更多信息，请参阅 [Apache Iceberg 表支持的数据类型支持的数据类型](querying-iceberg-supported-data-types.md)。

`ADD COLUMN` 是仅限元数据的操作。现有行上新添加的列的值为 `NULL`。

`DROP COLUMN` 从现有 Iceberg 表中删除一列。对于分区表，您不能删除属于当前分区规范的列。在删除列之前，必须先移除涉及该列的分区字段。有关更多信息，请参阅 [ALTER TABLE ADD、DROP 和 REPLACE PARTITION FIELD](#iceberg-alter-table-partition-field)。

## ALTER TABLE ALTER COLUMN
<a name="iceberg-alter-table-alter-column"></a>

```
ALTER TABLE {{iceberg_table}}
    ALTER COLUMN {{column_name}} TYPE {{updated_data_type}};
```

`ALTER TABLE ALTER COLUMN` 更改现有列的数据类型。只支持扩大类型，而不支持缩小。由于 `ALTER` 之后不会重写数据，因此在使用现有表数据时，缩小数据类型可能会导致溢出。根据 Iceberg 规范，支持进行以下类型的扩大：

```
int → bigint
float → double
decimal(P, S) → decimal(P2, S) where P2 > P (scale cannot be changed)
```

在 Amazon Redshift 中，数据类型可以具有别名。例如，4 字节整数使用类型名称 `int` 或 `int4`。只要它们映射到 Iceberg 类型中的 4 字节整数，就支持将类型扩大为 8 字节整数。

例如，使用 4 字节整数类型创建一个 Iceberg 表：

```
CREATE TABLE {{iceberg_table}} (cint int) USING ICEBERG LOCATION 's3://{{your-bucket-name}}/prefix/';
```

可以通过此 `ALTER` 语句来扩大其范围：

```
ALTER TABLE {{iceberg_table}} ALTER COLUMN cint TYPE int8;
```

有关 Amazon Redshift 类型和 Iceberg 类型之间数据类型映射的完整列表，请参阅 [Apache Iceberg 表支持的数据类型支持的数据类型](querying-iceberg-supported-data-types.md)。

不支持扩大属于现有分区规范的列的类型。

## ALTER TABLE SET TABLE PROPERTIES
<a name="iceberg-alter-table-set-properties"></a>

```
ALTER TABLE {{iceberg_table}}
SET TABLE PROPERTIES (
 'compression_type' = '{{compression_value}}');
```

此语句支持您覆盖默认的表属性。目前，该语句唯一支持的表属性是 `compression_type`。您可以将其覆盖，以便对 Iceberg 表 Parquet 文件使用不同的压缩类型。在 `ALTER` 之后插入的数据使用新的压缩类型。

`compression_type` 的可能值包括 `brotli`、`gzip`、`snappy`、`uncompressed` 和 `zstd`。

## ALTER TABLE ADD、DROP 和 REPLACE PARTITION FIELD
<a name="iceberg-alter-table-partition-field"></a>

```
ALTER TABLE {{iceberg_table}}
    ADD PARTITION FIELD {{column_name}} | {{transform_function}};
```

```
ALTER TABLE {{iceberg_table}}
    DROP PARTITION FIELD {{column_name}} | {{transform_function}};
```

```
ALTER TABLE {{iceberg_table}}
    REPLACE PARTITION FIELD {{column_name}} | {{transform_function}}
        WITH {{column_name}} | {{transform_function}};
```

`[ADD | DROP | REPLACE] PARTITION FIELD` 语句支持您更改现有的表分区规范，从而支持通过 Amazon Redshift 进行分区演变。

分区规范的 `ALTER` 语句仅更改表元数据，而不会对现有表数据进行重新分区。在 `ALTER` 之后，插入到表中的新数据遵循新定义的分区规范。

考虑这些语句的以下限制：
+ 通过 `ADD` 或 `REPLACE ... WITH ...` 定义新的分区字段时，新字段不能包含已经是其它分区字段的一部分的列。这与您在 `CREATE TABLE` 中定义初始分区规范时的限制相同。有关更多信息，请参阅 [CREATE TABLE](iceberg-writes-sql-syntax.md#iceberg-writes-create-table)。

  例如，当您有一个表时：

  ```
  CREATE TABLE {{iceberg_table}} ... PARTITIONED BY year(ship_date) USING ICEBERG ...;
  ```

  以下操作失败，因为 `ship_date` 已经是现有分区字段的一部分：

  ```
  ALTER TABLE {{iceberg_table}} ADD PARTITION FIELD bucket(128, ship_date);
  ```
+ 添加新的分区字段时，新添加的字段始终被视为表的最后一个分区级别。例如：

  ```
  CREATE TABLE {{iceberg_table}} ... PARTITIONED BY year(ship_date) USING ICEBERG ...;
  ALTER TABLE {{iceberg_table}} ADD PARTITION FIELD bucket(256, item_id);
  ```

  表分区规范与以下内容相同：

  ```
  CREATE TABLE {{iceberg_table}} ... PARTITIONED BY (year(ship_date), bucket(256, item_id))
      USING ICEBERG ...;
  ```
+ 删除分区字段时，它不仅限于最后一个分区级别。您可以删除任何现有的分区字段。例如：

  ```
  CREATE TABLE {{iceberg_table}} ... PARTITIONED BY (year(ship_date), bucket(256, item_id))
      USING ICEBERG ...;
  ALTER TABLE {{iceberg_table}} DROP PARTITION FIELD year(ship_date);
  ```

  在此 `ALTER` 后，该表仅按 `bucket(256, item_id)` 进行分区。
+ 调用 `REPLACE PARTITION FIELD ... WITH ...` 时，要替换的分区字段可以是规范中的任何字段，而不限于最后一个字段。例如：

  ```
  CREATE TABLE {{iceberg_table}} ... PARTITIONED BY (year(ship_date), bucket(256, item_id))
      USING ICEBERG ...;
  ALTER TABLE {{iceberg_table}} REPLACE PARTITION FIELD year(ship_date) WITH month(ship_date);
  ```

  在此 `ALTER` 后，表分区变为 `(month(ship_date), bucket(256, item_id))`。
+ 分区 `ALTER` 语句中不支持 `void` 转换。