Non so dove hai preso quella sintassi, ma COPY
non accetta un elenco di alias di colonna del genere. Vedi l'aiuto:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
non è una delle opzioni elencate; per vedere l'output completo, esegui \d copy
in psql, oppure guarda il manuale per la copy
comando in linea).
Non è presente alcuna funzione di mappatura in COPY
che consente di leggere solo alcune colonne del CSV di input. Sarebbe davvero utile, ma nessuno ha ancora avuto il tempo/l'interesse/il finanziamento per implementarlo. In realtà è solo una delle tante attività di trasformazione/filtraggio dei dati che le persone desiderano comunque.
PostgreSQL si aspetta l'elenco di colonne fornito in COPY
essere nello stesso ordine, da sinistra a destra, del file CSV e avere lo stesso numero di voci delle colonne del file CSV. Quindi se scrivi:
COPY con (date,kgs)
quindi PostgreSQL si aspetterà un CSV di input con esattamente due colonne . Utilizzerà la prima colonna CSV per il "date"
colonna della tabella e la seconda colonna CSV per il "kgs"
colonna della tabella. Non importa quali siano le intestazioni CSV, vengono ignorate se specifichi WITH (FORMAT CSV, HEADER ON)
o trattate come normali righe di dati se non specifichi HEADER
.
PostgreSQL 9.4 aggiunge FROM PROGRAM
a COPY
, quindi potresti eseguire un comando di shell per leggere il file e filtrarlo. Un semplice script Python o Perl farebbe il lavoro.
Se si tratta di un file di piccole dimensioni, apri una copia nel foglio di lavoro di tua scelta come file CSV, elimina le colonne indesiderate e salvalo, quindi solo la date
e kgs
le colonne rimangono.
In alternativa, COPY
in una tabella di staging che ha tutte le stesse colonne del CSV
, quindi esegui un INSERT INTO ... SELECT
per trasferire solo i dati desiderati nella tabella di destinazione reale.