すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:COPY ON COFLICTを使用してデータを上書きする

最終更新日:Sep 29, 2024

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句は、データがテーブル制約と競合する場合に挿入を無視するために使用されます。

  1. 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)
    );

  2. 次の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に置き換えます。

  3. 次のステートメントを実行して、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)
  4. 次の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
  5. 次の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)
  6. 次の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)