8

dist や sort キーなど、テーブルのいくつかのパラメーターを更新したいと思います。そのために、古いバージョンのテーブルの名前を変更し、新しいパラメーターを使用してテーブルを再作成しました (テーブルが作成されると、これらは変更できません)。

IDENTITY フィールドである古いテーブルの id フィールドを保持する必要があります。ただし、次のクエリを実行すると、エラーが発生します。

insert into edw.my_table_new select * from edw.my_table_old;
ERROR: cannot set an identity column to a value [SQL State=0A000] 

古いテーブルから同じ ID を保持するにはどうすればよいですか?

4

3 に答える 3

21

IDENTITY列を設定してデータをINSERTすることはできませんが、 COPYコマンドを使用して S3 からデータをロードすることはできます。

まず、 UNLOADを使用してソース テーブルのダンプを作成する必要があります。

次に、デフォルトの列値のロードで説明されているように、 EXPLICIT_IDSパラメータを指定してCOPYを使用します。

IDENTITY 列が列リストに含まれている場合、COPY コマンドで EXPLICIT_IDS オプションも指定する必要があります。そうしないと、COPY コマンドは失敗します。同様に、IDENTITY 列が列リストから省略され、EXPLICIT_IDS オプションが指定されている場合、COPY 操作は失敗します。

于 2013-11-07T06:44:05.210 に答える
6

列を明示的に指定して、ID 列を無視することができます。 insert into existing_table (col1, col2) select col1, col2 from another_table;

于 2016-09-04T21:24:53.703 に答える
1

ALTER TABLE APPENDを 2 回使用します。1 回目は IGNOREEXTRA を使用し、2 回目は FILLTARGET を使用します。

ソース テーブルに存在しない列がターゲット テーブルに含まれている場合は、FILLTARGET を含めます。このコマンドは、ソース テーブルの余分な列に、既定の列値または IDENTITY 値 (定義されている場合)、または NULL を入力します。

あるテーブルから別のテーブルに列を非常に迅速に移動します。dc1.large ノードの 1GB テーブルに 4 秒かかりました。

既存のソース テーブルからデータを移動して、ターゲット テーブルに行を追加します。
...
ALTER TABLE APPEND は通常、同様の CREATE TABLE AS または INSERT INTO 操作よりもはるかに高速です。これは、データが複製ではなく移動されるためです。

EXPLICIT_IDS を使用した UNLOAD + COPY よりも高速で簡単です。

于 2016-10-24T06:23:29.663 に答える