Jeg ved ikke, hvor du har den syntaks fra, men COPY
tager ikke sådan en liste over kolonnealiaser. Se hjælpen:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
er ikke en af de angivne muligheder; for at se den fulde outputkørsel \d copy
i psql, eller se i manualen for copy
kommando online).
Der er ingen kortlægningsfunktion i COPY
der kun lader dig læse nogle kolonner i input CSV. Det ville være rigtig nyttigt, men ingen har haft tid/interesse/finansiering til at implementere det endnu. Det er i virkeligheden kun én af mange datatransformations-/filtreringsopgaver, som folk ønsker.
PostgreSQL forventer kolonnelisten angivet i COPY
at være i samme rækkefølge, fra venstre mod højre, som det, der er i CSV-filen, og have det samme antal poster, som CSV-filen har kolonner. Så hvis du skriver:
COPY con (date,kgs)
så forventer PostgreSQL en input-CSV med præcis to kolonner . Den bruger den første csv-kolonne til "date"
tabelkolonne og den anden csv-kolonne for "kgs"
tabel kolonne. Det er ligeglad med, hvad CSV-headerne er, de ignoreres, hvis du angiver WITH (FORMAT CSV, HEADER ON)
, eller behandlet som normale datarækker, hvis du ikke angiver HEADER
.
PostgreSQL 9.4 tilføjer FROM PROGRAM
til COPY
, så du kan køre en shell-kommando for at læse filen og filtrere den. Et simpelt Python- eller Perl-script ville gøre jobbet.
Hvis det er en lille fil, skal du blot åbne en kopi i regnearket efter eget valg som en csv-fil, slette de uønskede kolonner og gemme den, så kun date
og kgs
kolonner forbliver.
Alternativt COPY
til en iscenesættelsestabel, der har alle de samme kolonner som CSV
, og lav derefter en INSERT INTO ... SELECT
at overføre netop de ønskede data til den rigtige måltabel.