メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

ALTER TABLE APPEND

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

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

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

ソーステーブルとターゲットテーブルの両方は、永続テーブルである必要があります。両方のテーブルは同じ分散スタイルと分散キーを使用する必要があります (定義されている場合)。テーブルがソートされている場合、両方のテーブルは同じソート形式を使用し、ソートキーとして同じ列を定義する必要があります。

ALTER TABLE APPEND コマンドは、オペレーションが完了するとすぐに自動的にコミットします。ロールバックすることはできません。トランザクションブロック (BEGIN ... END) 内で ALTER TABLE APPEND を実行することはできません。

構文

Copy
ALTER TABLE target_table_name APPEND FROM source_table_name [ IGNOREEXTRA | FILLTARGET ]

パラメーター

target_table_name

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

FROM source_table_name

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

IGNOREEXTRA

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

FILLTARGET

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

ALTER TABLE APPEND の使用に関する注意事項

ALTER TABLE APPEND はソーステーブルからターゲットテーブルに同一の列のみを移動します。列の順序は関係ありません。

ソーステーブルまたはターゲットテーブルに追加の列が含まれている場合、次のルールに従って FILLTARGET または IGNOREEXTRA を使用します。

  • ターゲットテーブルに存在しない列がソーステーブルに含まれている場合は、IGNOREEXTRA を含めます。コマンドは、ソーステーブルの追加の列を無視します。

  • ソーステーブルに存在しない列がターゲットテーブルに含まれている場合は、FILLTARGET を含めます。コマンドは、デフォルトの列値または IDENTITY 値 (定義されている場合)、あるいは NULL をソーステーブルの追加の列に入れます。

  • ソーステーブルとターゲットテーブルの両方に追加の列が含まれる場合、コマンドは失敗します。FILLTARGET と IGNOREEXTRA の両方を使用することはできません。

同じ名前で別の属性を持つ列が両方のテーブルに存在する場合、コマンドは失敗します。同様の名前の列には、共通して次の属性が必要です。

  • データ型

  • 列のサイズ

  • 圧縮エンコード

  • null でない

  • ソート形式

  • ソートキーの列

  • 分散スタイル

  • 分散キー列

IDENTITY 列を追加することはできません。ソーステーブルとターゲットテーブルの両方に IDENTITY 列がある場合、コマンドは失敗します。ソーステーブルのみに IDENTITY 列がある場合、IDENTITY 列が無視されるように IGNOREEXTRA パラメーターを含めます。ターゲットテーブルのみに IDENTITY 列がある場合は、テーブルに対して定義されている IDENTITY 句に従って IDENTITY 列が入力されるように FILLTARGET パラメーターを含めます。 詳細については、「DEFAULT」を参照してください。

ALTER TABLE APPEND の例

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

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

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

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

最初に、PG_TABLE_DEF システムカタログテーブルにクエリを実行し、両方のテーブルに、同じ列属性を持つ同じ列があることを確認します。

Copy
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

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

Copy
select count(*) from sales_monthly; count ------- 2000 (1 row) select count(*) from sales; count ------- 412,214 (1 row)

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

Copy
alter table sales append from sales_monthly;

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

Copy
select count(*) from sales_monthly; count ------- 0 (1 row) select count(*) from sales; count ------- 414214 (1 row)

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

Copy
alter table sales append from sales_listing ignoreextra;

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

Copy
alter table sales_report append from sales_month filltarget;