Jag vet inte var du fick den syntaxen, men COPY
tar inte en lista med sådana kolumnalias. Se hjälpen:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
är inte ett av de listade alternativen; för att se hela utdatakörningen \d copy
i psql, eller titta i manualen för copy
kommando online).
Det finns ingen mappningsmöjlighet i COPY
som låter dig läsa endast vissa kolumner i inmatnings-CSV-filen. Det skulle vara riktigt användbart, men ingen har haft tid/intresse/finansiering för att implementera det ännu. Det är egentligen bara en av många datatransformerings-/filtreringsuppgifter som folk vill ha.
PostgreSQL förväntar sig kolumnlistan som ges i COPY
att vara i samma ordning, från vänster till höger, som det som finns i CSV-filen, och ha samma antal poster som CSV-filen har kolumner. Så om du skriver:
COPY con (date,kgs)
då kommer PostgreSQL att förvänta sig en indata-CSV med exakt två kolumner . Den kommer att använda den första csv-kolumnen för "date"
tabellkolumnen och den andra csv-kolumnen för "kgs"
tabell kolumn. Det bryr sig inte om vilka CSV-rubriker är, de ignoreras om du anger WITH (FORMAT CSV, HEADER ON)
, eller behandlas som normala datarader om du inte anger HEADER
.
PostgreSQL 9.4 lägger till FROM PROGRAM
till COPY
, så att du kan köra ett skalkommando för att läsa filen och filtrera den. Ett enkelt Python- eller Perl-skript skulle göra jobbet.
Om det är en liten fil öppnar du bara en kopia i valfritt kalkylark som en csv-fil, tar bort de oönskade kolumnerna och sparar den, så bara date
och kgs
kolumner kvar.
Alternativt COPY
till en mellanställningstabell som har alla samma kolumner som CSV
, gör sedan en INSERT INTO ... SELECT
för att överföra bara önskad data till den verkliga måltabellen.