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.
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 paramsCOPY 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
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) );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' \.CatatanGanti spasi antara dua nilai kolom dengan Tab saat menyalin data di atas.
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)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' \.CatatanGanti 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 1Jalankan 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' \.CatatanGanti 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)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' \.CatatanGanti 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)