全部产品
Search
文档中心

AnalyticDB:Gunakan COPY ON CONFLICT untuk menimpa data

更新时间:Jun 26, 2025

AnalyticDB for PostgreSQL memungkinkan Anda menimpa data menggunakan pernyataan COPY ON CONFLICT. Saat menjalankan pernyataan ini, Anda dapat memeriksa kendala pada seluruh tabel dan menimpa data di semua kolom.

AnalyticDB for PostgreSQL mendukung impor data melalui pernyataan COPY. Namun, jika data yang diimpor bertentangan dengan kendala tabel, pernyataan COPY dapat gagal dengan pesan kesalahan. Untuk mengatasi masalah ini, AnalyticDB for PostgreSQL menyediakan pernyataan COPY ON CONFLICT untuk menimpa data atau mengabaikan operasi penulisan.

Catatan

Pernyataan COPY ON CONFLICT hanya didukung pada instance AnalyticDB for PostgreSQL V6.0 versi minor 20210528 atau lebih baru. Untuk menggunakan fitur ini, disarankan memperbarui instance ke versi minor terbaru. Informasi lebih lanjut dapat ditemukan di Perbarui versi mesin minor.

Batasan

  • Tabel tempat Anda ingin mengimpor data harus berupa tabel heap, bukan tabel append-optimized (AO), karena tabel AO tidak mendukung indeks unik.

  • Tabel dapat berupa tabel partisi hanya jika versi minor instance adalah 6.3.6.1 atau lebih baru. Informasi tentang cara memperbarui versi minor instance dapat ditemukan di Perbarui versi mesin minor.

  • Tabel tidak boleh berupa tampilan yang dapat diperbarui.

  • COPY ON CONFLICT hanya mendukung klausa COPY FROM dan tidak mendukung klausa COPY TO.

  • COPY ON CONFLICT tidak mengizinkan penentuan parameter indeks KONFLIK. Secara default, semua kolom yang dibatasi akan diperbarui. Jika parameter indeks KONFLIK ditentukan, pernyataan COPY akan gagal dengan pesan kesalahan.

    COPY NATION FROM stdin DO ON CONFLICT(n_nationkey) DO UPDATE;
    ERROR:  COPY ON CONFLICT does NOT support CONFLICT index params
  • COPY ON CONFLICT tidak mengizinkan penentuan parameter UPDATE SET. Secara default, semua kolom akan diperbarui. Jika parameter UPDATE SET ditentukan, pernyataan COPY akan gagal dengan pesan kesalahan. Contoh:

    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

Sintaksis

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 mendukung klausa DO ON CONFLICT DO UPDATE dan DO ON CONFLICT DO NOTHING.

  • Klausa DO ON CONFLICT DO UPDATE digunakan untuk memperbarui semua kolom saat data bertentangan dengan kendala tabel.

  • Klausa DO ON CONFLICT DO NOTHING digunakan untuk mengabaikan penyisipan saat data bertentangan dengan kendala tabel.

Contoh

  1. Buat tabel bernama NATION dengan empat kolom, dan tetapkan N_NATIONKEY sebagai kunci utama untuk memberlakukan kendala pada tabel.

    CREATE TABLE NATION (
        N_NATIONKEY  INTEGER,
        N_NAME       CHAR(25),
        N_REGIONKEY  INTEGER,
        N_COMMENT    VARCHAR(152),
        PRIMARY KEY (N_NATIONKEY)
    );

  2. Jalankan pernyataan COPY berikut untuk mengimpor data:

    COPY NATION FROM stdin;

    Setelah bendera >> muncul, masukkan baris data berikut secara berurutan:

    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'
    \.
    Catatan

    Ganti spasi antara dua nilai kolom dengan Tab saat menyalin data di atas.

  3. Jalankan pernyataan berikut untuk menanyakan tabel NATION. Data di atas berhasil diimpor.

    SELECT * from NATION;

    Hasil contoh:

     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. Jalankan pernyataan COPY berikut untuk menyisipkan baris data yang bertentangan dengan kunci utama:

    COPY NATION FROM stdin;

    Setelah bendera >> muncul, masukkan baris data berikut secara berurutan:

    0 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco'
    \.
    Catatan

    Ganti spasi antara dua nilai kolom dengan Tab saat menyalin data di atas.

    Pesan kesalahan serupa akan dikembalikan:

    ERROR:  duplicate key value violates unique constraint "nation_pkey"
    DETAIL:  Key (n_nationkey)=(0) already exists.
    CONTEXT:  COPY nation, line 1
  5. Jalankan pernyataan COPY ON CONFLICT berikut untuk memperbarui data yang bertentangan:

    COPY NATION FROM stdin DO  ON CONFLICT DO UPDATE;

    Setelah bendera >> muncul, masukkan baris data berikut secara berurutan:

    0 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco'
    \.
    Catatan

    Ganti spasi antara dua nilai kolom dengan Tab saat menyalin data di atas.

    Tidak ada pesan kesalahan yang dikembalikan. Jalankan pernyataan berikut untuk menanyakan tabel NATION. Baris data dengan nilai kunci utama 0 diperbarui dalam tabel.

    SELECT * FROM NATION;

    Hasil contoh:

     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. Jalankan pernyataan COPY ON CONFLICT berikut untuk mengabaikan penyisipan data yang bertentangan:

    COPY NATION FROM stdin DO ON CONFLICT DO NOTHING;

    Setelah bendera >> muncul, masukkan baris data berikut secara berurutan:

    1 'GERMANY' 3 'l platelets. regular accounts x-ray: unusual, regular acco'
    \.
    Catatan

    Ganti spasi antara dua nilai kolom dengan Tab saat menyalin data di atas.

    Tidak ada pesan kesalahan yang dikembalikan. Jalankan pernyataan berikut untuk menanyakan tabel NATION. Baris data dengan nilai kunci utama 1 tidak diperbarui dalam tabel.

    SELECT * FROM NATION;

    Hasil contoh:

     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)