ALTER TABLE APPEND - Amazon Redshift

ALTER TABLE APPEND

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

注記

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

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

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

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

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

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

構文

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 ステートメントを使用して、デフォルトの IDENTITY 列を追加できます。詳細については、「CREATE TABLE」を参照してください。

ALTER TABLE APPEND の例

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

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

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

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

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

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;