Ik weet niet waar je die syntaxis vandaan hebt, maar COPY
neemt geen lijst van dergelijke kolomaliassen. Zie de hulp:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(AS
is niet een van de vermelde opties; om de volledige uitvoer te zien, voer \d copy
uit in psql, of bekijk de handleiding voor de copy
commando online).
Er is geen kaartvoorziening in COPY
waarmee u slechts enkele kolommen van de invoer-CSV kunt lezen. Het zou erg handig zijn, maar niemand heeft de tijd/interesse/financiering gehad om het te implementeren. Het is eigenlijk maar een van de vele taken voor gegevenstransformatie/filtering die mensen toch willen.
PostgreSQL verwacht de kolomlijst gegeven in COPY
in dezelfde volgorde moeten staan, van links naar rechts, als wat er in het CSV-bestand staat, en hetzelfde aantal vermeldingen hebben als het CSV-bestand kolommen heeft. Dus als je schrijft:
COPY con (date,kgs)
dan verwacht PostgreSQL een invoer-CSV met exact twee kolommen . Het gebruikt de eerste csv-kolom voor de "date"
tabelkolom en de tweede csv-kolom voor de "kgs"
tabel kolom. Het maakt niet uit wat de CSV-headers zijn, ze worden genegeerd als u WITH (FORMAT CSV, HEADER ON)
opgeeft , of behandeld als normale gegevensrijen als u HEADER
niet opgeeft .
PostgreSQL 9.4 voegt FROM PROGRAM
toe naar COPY
, dus je zou een shell-opdracht kunnen uitvoeren om het bestand te lezen en te filteren. Een eenvoudig Python- of Perl-script zou het werk doen.
Als het een klein bestand is, open dan gewoon een kopie in de spreadsheet van je keuze als csv-bestand, verwijder de ongewenste kolommen en sla het op, dus alleen de date
en kgs
kolommen blijven.
Als alternatief, COPY
naar een verzameltabel die allemaal dezelfde kolommen heeft als de CSV
, doe dan een INSERT INTO ... SELECT
om alleen de gewenste gegevens over te zetten naar de echte doeltabel.