Saya tidak tahu dari mana Anda mendapatkan sintaks itu, tetapi COPY
tidak mengambil daftar alias kolom seperti itu. Lihat bantuan:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
bukan salah satu opsi yang tercantum; untuk melihat output penuh jalankan \d copy
di psql, atau lihat manual untuk copy
perintah online).
Tidak ada fasilitas pemetaan di COPY
yang memungkinkan Anda hanya membaca beberapa kolom dari input CSV. Ini akan sangat berguna, tetapi belum ada yang punya waktu/bunga/dana untuk mengimplementasikannya. Ini benar-benar hanya satu dari banyak tugas transformasi/pemfilteran data yang diinginkan orang.
PostgreSQL mengharapkan daftar kolom yang diberikan dalam COPY
berada dalam urutan yang sama, kiri-ke-kanan, seperti yang ada di file CSV, dan memiliki jumlah entri yang sama dengan file CSV yang memiliki kolom. Jadi jika Anda menulis:
COPY con (date,kgs)
maka PostgreSQL akan mengharapkan input CSV dengan tepatnya dua kolom . Ini akan menggunakan kolom csv pertama untuk "date"
kolom tabel dan kolom csv kedua untuk "kgs"
kolom tabel. Tidak peduli apa itu header CSV, mereka akan diabaikan jika Anda menentukan WITH (FORMAT CSV, HEADER ON)
, atau diperlakukan sebagai baris data normal jika Anda tidak menentukan HEADER
.
PostgreSQL 9.4 menambahkan FROM PROGRAM
ke COPY
, sehingga Anda dapat menjalankan perintah shell untuk membaca file dan memfilternya. Skrip Python atau Perl sederhana akan melakukan pekerjaan itu.
Jika file kecil, cukup buka salinan di spreadsheet pilihan Anda sebagai file csv, hapus kolom yang tidak diinginkan, dan simpan, jadi hanya date
dan kgs
kolom tetap ada.
Sebagai alternatif, COPY
ke tabel staging yang memiliki semua kolom yang sama dengan CSV
, lalu lakukan INSERT INTO ... SELECT
untuk mentransfer hanya data yang diinginkan ke tabel target sebenarnya.