

 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/)を参照してください。

# ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND"></a>

既存のソーステーブルのデータを移動して、ターゲットテーブルに行を追加します。ソーステーブル内のデータはターゲットテーブルの一致する列に移動されます。列の順序は関係ありません。データがターゲットテーブルに正常に追加されると、ソーステーブルは空になります。通常、ALTER TABLE APPEND は、データを複製するのではなく移動するため、同様の [CREATE TABLE AS](r_CREATE_TABLE_AS.md) または [INSERT](r_INSERT_30.md) の INTO オペレーションよりもはるかに高速です。

**注記**  
ALTER TABLE APPEND は、ソーステーブルとターゲットテーブル間でデータブロックを移動します。パフォーマンスを向上させるため、ALTER TABLE APPEND は追加操作の一部としてストレージを圧縮しません。その結果、ストレージ使用量は一時的に増加します。スペースを回復するには、[VACUUM](r_VACUUM_command.md)操作を実行します。

同じ名前の列には、同じ列属性も必要です。ソーステーブルまたはターゲットテーブルに、他のテーブルに含まれる列が含まれない場合は、IGNOREEXTRA または FILLTARGET パラメータを使用して、追加の列を管理する方法を指定します。

IDENTITY 列を追加することはできません。テーブルの両方に IDENTITY 列が含まれる場合、コマンドは失敗します。1 つのテーブルのみに IDENTITY 列がある場合は、FILLTARGET パラメータまたは IGNOREEXTRA パラメータを含めます。詳細については、「[ALTER TABLE APPEND の使用に関する注意事項](#r_ALTER_TABLE_APPEND_usage)」を参照してください。

GENERATED BY DEFAULT AS IDENTITY 列を追加できます。GENERATED BY DEFAULT AS IDENTITY として定義された列を、指定した値で更新できます。詳細については、「[ALTER TABLE APPEND の使用に関する注意事項](#r_ALTER_TABLE_APPEND_usage)」を参照してください。

ターゲットテーブルは永続テーブルである必要があります。ただし、ソースはパーマネントテーブルでも、ストリーミング取り込み用に設定されたマテリアライズドビューでもかまいません。両方のオブジェクトは同じ分散スタイルと分散キーを使用する必要があります (定義されている場合)。オブジェクトがソートされている場合、両方のオブジェクトは同じソート形式を使用し、ソートキーとして同じ列を定義する必要があります。

ALTER TABLE APPEND コマンドは、オペレーションが完了するとすぐに自動的にコミットします。ロールバックすることはできません。トランザクションブロック (BEGIN ... END) 内で ALTER TABLE APPEND を実行することはできません。トランザクションの詳細については、「[Amazon Redshift の分離レベル](c_serial_isolation.md)」を参照してください。

## 必要な権限
<a name="r_ALTER_TABLE_APPEND-privileges"></a>

ALTER TABLE APPEND コマンドによっては、次のいずれかの権限が必要です。
+ スーパーユーザー
+ ALTER TABLE システム権限を持つユーザー
+ ソーステーブルに対する DELETE 権限と SELECT 権限、およびターゲットテーブルに対する INSERT 権限を持つユーザー

## 構文
<a name="r_ALTER_TABLE_APPEND-synopsis"></a>

```
ALTER TABLE target_table_name APPEND FROM [ source_table_name | source_materialized_view_name ]
[ IGNOREEXTRA | FILLTARGET ]
```

マテリアライズドビューからの追加は、マテリアライズドビューが [マテリアライズドビューへのストリーミング取り込み](materialized-view-streaming-ingestion.md) に設定されている場合にのみ機能します。

## パラメータ
<a name="r_ALTER_TABLE_APPEND-parameters"></a>

 *target\_table\_name*   
列が追加されるテーブルの名前。テーブル名のみを指定するか、*schema\_name.table\_name* 形式で特定のスキーマを使用します。ターゲットテーブルは既存の永続テーブルである必要があります。

 FROM *source\_table\_name*   
追加する行を提供するテーブルの名前。テーブル名のみを指定するか、*schema\_name.table\_name* 形式で特定のスキーマを使用します。ソーステーブルは既存の永続テーブルである必要があります。

 *source\_materialized\_view\_name* から   
追加する行を提供するマテリアライズドビューの名前。マテリアライズドビューからの追加は、マテリアライズドビューが [マテリアライズドビューへのストリーミング取り込み](materialized-view-streaming-ingestion.md) に設定されている場合にのみ機能します。ソースマテリアライズドビューは既に存在している必要があります。

IGNOREEXTRA   
ターゲットテーブルにない列がソーステーブルに含まれている場合に、追加の列のデータを破棄することを指定するキーワード。IGNOREEXTRA を FILLTARGET と使用することはできません。

FILLTARGET   
ソーステーブルにない列がターゲットテーブルに含まれている場合に、列に [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 列値を入れるか (定義されている場合)、NULL にすることを指定するキーワード。IGNOREEXTRA を FILLTARGET と使用することはできません。

## ALTER TABLE APPEND の使用に関する注意事項
<a name="r_ALTER_TABLE_APPEND_usage"></a>
+ ALTER TABLE APPEND はソーステーブルからターゲットテーブルに同一の列のみを移動します。列の順序は関係ありません。
+  ソーステーブルまたはターゲットテーブルに追加の列が含まれている場合、以下のルールに従って FILLTARGET または IGNOREEXTRA を使用します。
  + ターゲットテーブルに存在しない列がソーステーブルに含まれている場合は、IGNOREEXTRA を含めます。コマンドは、ソーステーブルの追加の列を無視します。
  + ソーステーブルに存在しない列がターゲットテーブルに含まれている場合は、FILLTARGET を含めます。コマンドは、デフォルトの列値または IDENTITY 値 (定義されている場合)、あるいは NULL をターゲットテーブルの追加の列に入れます。
  + ソーステーブルとターゲットテーブルの両方に追加の列が含まれる場合、コマンドは失敗します。FILLTARGET と IGNOREEXTRA の両方を使用することはできません。
+ 同じ名前で別の属性を持つ列が両方のテーブルに存在する場合、コマンドは失敗します。同様の名前の列には、共通して次の属性が必要です。
  + データ型
  + 列のサイズ
  + 圧縮エンコード
  + null でない
  + ソート形式
  + ソートキーの列
  + 分散スタイル
  + 分散キー列
+ IDENTITY 列を追加することはできません。ソーステーブルとターゲットテーブルの両方に IDENTITY 列がある場合、コマンドは失敗します。ソーステーブルのみに IDENTITY 列がある場合、IDENTITY 列が無視されるように IGNOREEXTRA パラメータを含めます。ターゲットテーブルのみに IDENTITY 列がある場合は、テーブルに対して定義されている IDENTITY 句に従って IDENTITY 列が入力されるように FILLTARGET パラメータを含めます。詳細については、「[DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default)」を参照してください。
+ ALTER TABLE APPEND ステートメントを使用して、デフォルトの IDENTITY 列を追加できます。詳細については、「[CREATE TABLE](r_CREATE_TABLE_NEW.md)」を参照してください。
+ ALTER TABLE APPEND オペレーションは、次のいずれかに接続された Amazon Redshift ストリーミングマテリアライズドビューで実行されると、排他的ロックを保持します。
  +  1 つの Amazon Kinesis Data Streams 
  +  1 つの Amazon Managed Streaming for Apache Kafka トピック 
  +  Confluent Cloud Kafka トピックなど、サポートされている外部ストリーム 

  詳細については、「[マテリアライズドビューへのストリーミング取り込み](materialized-view-streaming-ingestion.md)」を参照してください。

## ALTER TABLE APPEND の例
<a name="r_ALTER_TABLE_APPEND_examples"></a>

最新の売上を把握するために、組織で SALES\_MONTHLY テーブルを維持しているとします。毎月、トランザクションテーブルから SALES テーブルにデータを移動するとします。

次の INSERT INTO または TRUNCATE コマンドを使用して、このタスクを完了できます。

```
insert into sales (select * from sales_monthly);
truncate sales_monthly;
```

ただし、ALTER TABLE APPEND コマンドを使用すると、同じオペレーションをはるかに効率的に実行できます。

最初に、[PG\_TABLE\_DEF](r_PG_TABLE_DEF.md)システムカタログテーブルにクエリを実行し、両方のテーブルに、同じ列属性を持つ同じ列があることを確認します。

```
select trim(tablename) as table, "column", trim(type) as type,
encoding, distkey, sortkey, "notnull"
from pg_table_def where tablename like 'sales%';

table      | column     | type                        | encoding | distkey | sortkey | notnull
-----------+------------+-----------------------------+----------+---------+---------+--------
sales      | salesid    | integer                     | lzo      | false   |       0 | true
sales      | listid     | integer                     | none     | true    |       1 | true
sales      | sellerid   | integer                     | none     | false   |       2 | true
sales      | buyerid    | integer                     | lzo      | false   |       0 | true
sales      | eventid    | integer                     | mostly16 | false   |       0 | true
sales      | dateid     | smallint                    | lzo      | false   |       0 | true
sales      | qtysold    | smallint                    | mostly8  | false   |       0 | true
sales      | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
sales      | commission | numeric(8,2)                | delta32k | false   |       0 | false
sales      | saletime   | timestamp without time zone | lzo      | false   |       0 | false
salesmonth | salesid    | integer                     | lzo      | false   |       0 | true
salesmonth | listid     | integer                     | none     | true    |       1 | true
salesmonth | sellerid   | integer                     | none     | false   |       2 | true
salesmonth | buyerid    | integer                     | lzo      | false   |       0 | true
salesmonth | eventid    | integer                     | mostly16 | false   |       0 | true
salesmonth | dateid     | smallint                    | lzo      | false   |       0 | true
salesmonth | qtysold    | smallint                    | mostly8  | false   |       0 | true
salesmonth | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | commission | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

次に、各テーブルのサイズを確認します。

```
select count(*) from sales_monthly;
 count
-------
  2000
(1 row)

select count(*) from sales;
 count
-------
 412,214
(1 row)
```

ここで、次の ALTER TABLE APPEND コマンドを実行します。

```
alter table sales append from sales_monthly;         
```

もう一度、各テーブルのサイズを確認します。SALES\_MONTHLY テーブルは 0 行になり、SALES テーブルは 2000 行増えています。

```
select count(*) from sales_monthly;
 count
-------
     0
(1 row)

select count(*) from sales;
 count
-------
 414214
(1 row)
```

ソーステーブルにターゲットテーブルより多くの列がある場合は、IGNOREEXTRA パラメータを指定します。次の例では、IGNOREEXTRA パラメータを使用して、SALES テーブルに追加するときに SALES\_LISTING テーブル列の追加の列を無視します。

```
alter table sales append from sales_listing ignoreextra;
```

ターゲットテーブルにソーステーブルより多くの列がある場合は、FILLTARGET パラメータを指定します。次の例では、FILLTARGET パラメータを使用して、SALES\_MONTH テーブルに存在しない列を SALES\_REPORT テーブルに入力します。

```
alter table sales_report append from sales_month filltarget;
```

次の例は、マテリアライズドビューをソースとして ALTER TABLE APPEND を使用する方法の例を示しています。

```
ALTER TABLE target_tbl APPEND FROM my_streaming_materialized_view;
```

この例のテーブル名とマテリアライズドビュー名はサンプルです。マテリアライズドビューからの追加は、マテリアライズドビューが [マテリアライズドビューへのストリーミング取り込み](materialized-view-streaming-ingestion.md) に設定されている場合にのみ機能します。ソースマテリアライズドビューのすべてのレコードを、マテリアライズドビューと同じスキーマのターゲットテーブルに移動し、マテリアライズドビューはそのまま残します。これは、データのソースがテーブルである場合と同じ動作です。