AnalyticDB for PostgreSQLでは、COPY ON CONFLICTステートメントを使用してデータを上書きできます。 COPY ON CONFLICT文を実行すると, 表全体の制約だけをチェックし, 列全体のデータだけを上書きできます。
AnalyticDB for PostgreSQLでは、COPYステートメントを実行してデータをインポートできます。 ただし、インポートするデータがテーブルの制約と競合する場合、COPYステートメントがエラーメッセージで失敗することがあります。 この問題を解決するために、AnalyticDB for PostgreSQLは、データを上書きするか、書き込み操作を無視するCOPY ON CONFLICTステートメントを提供しています。
COPY ON CONFLICTステートメントは、マイナーバージョン20210528以降のAnalyticDB for PostgreSQL V6.0インスタンスでのみサポートされています。 このステートメントを使用するには、インスタンスを最新のマイナーバージョンに更新することを推奨します。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
制限事項
データをインポートするテーブルはヒープテーブルである必要がありますが、追加最適化 (AO) テーブルではありません。 これは、AOテーブルが一意のインデックスをサポートしないためです。
インスタンスのマイナーバージョンが6.3.6.1以降の場合にのみ、テーブルをパーティションテーブルにできます。 インスタンスのマイナーバージョンを更新する方法については、「マイナーエンジンバージョンの更新」をご参照ください。
テーブルを更新可能なビューにすることはできません。
COPY ON CONFLICTには、COPY FROM句のみを含めることができ、COPY TO句を含めることはできません。
COPY ON CONFLICTでは、CONFLICTインデックスパラメーターを指定できません。 デフォルトでは、COPY ON CONFLICTはすべての制約付き列を決定します。 CONFLICT indexパラメーターが指定されている場合、COPYステートメントはエラーメッセージで失敗します。
COPY NATION FROM stdin DO ON CONFLICT(n_nationkey) DO UPDATE; ERROR: COPY ON CONFLICT does NOT support CONFLICT index params
をサポートしていません
COPY ON COFLICTでは、UPDATE SETパラメーターを指定できません。 デフォルトでは、COPY ON COFLICTはすべての列を更新します。 UPDATE SETパラメーターが指定されている場合、COPYステートメントはエラーメッセージで失敗します。 例:
COPY NATION FROM stdin DO ON CONFLICT DO UPDATE SET n_nationkey = excluded.n_nationkey; ERROR: COPY ON CONFLICT does NOT support UPDATE SET targets
をサポートしていません
構文
COPY table [(column [, ...])] FROM {'file' | STDIN}
[ [WITH]
[BINARY]
[OIDS]
[HEADER]
[DELIMITER [ AS ] 'delimiter']
[NULL [ AS ] 'null string']
[ESCAPE [ AS ] 'escape' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[CSV [QUOTE [ AS ] 'quote']
[FORCE NOT NULL column [, ...]]
[FILL MISSING FIELDS]
[[LOG ERRORS]
SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]
[DO ON CONFLICT DO UPDATE | NOTHING]
COPY ON CONFLICTは、DO ON CONFLICT DO UPDATEおよびDO ON CONFLICT DO NOTHING句をサポートしています。
DO ON CONFLICT DO UPDATE句は、データがテーブル制約と競合する場合に列全体を更新するために使用されます。
DO ON CONFLICT DO NOTHING句は、データがテーブル制約と競合する場合に挿入を無視するために使用されます。
例
NATIONという名前のテーブルを作成します。 テーブルに4つの列を設定し、テーブルに制約を適用する主キーとしてN_NATIONKEYを指定します。
CREATE TABLE NATION ( N_NATIONKEY INTEGER, N_NAME CHAR(25), N_REGIONKEY INTEGER, N_COMMENT VARCHAR(152), PRIMARY KEY (N_NATIONKEY) );
次のCOPY文を実行してデータをインポートします。
COPY NATION FROM stdin;
>> フラグが表示されたら、次の行のデータを順番に入力します。
0 'ALGERIA' 0 'haggle. carefully final deposits detect slyly agai' 1 'ARGENTINA' 1 'al foxes promise slyly according to the regular accounts. bold requests alon' 2 'BRAZIL' 1 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 'CANADA' 1 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' \.
説明上記のデータをコピーするときは、2つの列の値の間のスペースをTabに置き換えます。
次のステートメントを実行して、NATIONテーブルを照会します。 上記のデータがインポートされます。
SELECT * from NATION;
サンプル結果:
n_nationkey | n_name | n_regionkey | n_comment -------------+---------------------------+-------------+------------------------------------------------------------------------------------------------------------ 2 | 'BRAZIL' | 1 | 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 | 'CANADA' | 1 | 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' 0 | 'ALGERIA' | 0 | ' haggle. carefully final deposits detect slyly agai' 1 | 'ARGENTINA' | 1 | 'al foxes promise slyly according to the regular accounts. bold requests alon' (4 rows)
次のCOPYステートメントを実行して、主キーと競合するデータの行を挿入します。
COPY NATION FROM stdin;
>> フラグが表示されたら、次の行のデータを順番に入力します。
0 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco' \.
説明上記のデータをコピーするときは、2つの列の値の間のスペースをTabに置き換えます。
同様のエラーメッセージが返されます。
ERROR: duplicate key value violates unique constraint "nation_pkey" DETAIL: Key (n_nationkey)=(0) already exists. CONTEXT: COPY nation, line 1
次のCOPY ON CONFLICTステートメントを実行して、競合するデータを更新します。
COPY NATION FROM stdin DO ON CONFLICT DO UPDATE;
>> フラグが表示されたら、次の行のデータを順番に入力します。
0 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco' \.
説明上記のデータをコピーするときは、2つの列の値の間のスペースをTabに置き換えます。
エラーメッセージは返されません。 次のステートメントを実行して、NATIONテーブルを照会します。 プライマリキー値が0のデータの行がテーブル内で更新されます。
SELECT * FROM NATION;
サンプル結果:
n_nationkey | n_name | n_regionkey | n_comment -------------+---------------------------+-------------+------------------------------------------------------------------------------------------------------------ 2 | 'BRAZIL' | 1 | 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 | 'CANADA' | 1 | 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' 1 | 'ARGENTINA' | 1 | 'al foxes promise slyly according to the regular accounts. bold requests alon' 0 | 'GERMANY' | 3 | 'l platelets. regular accounts x-ray: unusual, regular acco' (4 rows)
次のCOPY ON CONFLICTステートメントを実行して、競合するデータの挿入を無視します。
COPY NATION FROM stdin DO ON CONFLICT DO NOTHING;
>> フラグが表示されたら、次の行のデータを順番に入力します。
1 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco' \.
説明上記のデータをコピーするときは、2つの列の値の間のスペースをTabに置き換えます。
エラーメッセージは返されません。 次のステートメントを実行して、NATIONテーブルを照会します。 プライマリキー値が1のデータの行は、テーブル内で更新されません。
SELECT * FROM NATION;
サンプル結果:
n_nationkey | n_name | n_regionkey | n_comment -------------+---------------------------+-------------+------------------------------------------------------------------------------------------------------------ 2 | 'BRAZIL' | 1 | 'y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly speci' 3 | 'CANADA' | 1 | 'eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold' 1 | 'ARGENTINA' | 1 | 'al foxes promise slyly according to the regular accounts. bold requests alon' 0 | 'GERMANY' | 3 | 'l platelets. regular accounts x-ray: unusual, regular acco' (4 rows)