

 Amazon Redshift は、パッチ 198 以降、新しい 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 テーブルの外部スキーマ参照または 3 つの部分からなる表記参照の使用をサポートしています。以下の構文例では、`{{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}}` には、パーティション列またはパーティション化されていない列のいずれも指定できます。名前を変更した後、列のデータ型とパーティション仕様は変更されません。

**注記**  
`ALTER TABLE RENAME COLUMN` は、AWS Lake Formation に登録されたテーブルではサポートされていません。

## 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 テーブルに 1 つの列を追加します。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 バイト int にマッピングされている限り、8 バイト整数への型拡張が許可されます。

例えば、Iceberg テーブルは 4 バイトの整数型を使用して作成されます。

```
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))` になります。
+ `void` 変換はパーティション `ALTER` ステートメントではサポートされていません。