Ce face COPY și \copy
COPY mută date între un tabel și un fișier mult mai repede decât mii de comenzi INSERT. Este metoda obișnuită pentru importuri mari și exporturi CSV.
Diferența importantă: COPY ... FROM '/cale/fisier.csv' citește fișierul de pe serverul bazei de date și cere drepturi speciale (superuser sau rolul pg_read_server_files / pg_write_server_files). Comanda psql \copy are aceeași sintaxă, dar citește și scrie fișiere pe calculatorul unde rulează psql, cu drepturile tale obișnuite.
Din PostgreSQL 17, opțiunea ON_ERROR ignore sare peste rândurile cu valori care nu se potrivesc tipului coloanei, în loc să oprească tot importul.
Parametri
| Parametru | Descriere |
|---|---|
FORMAT csv | text | binary |
Formatul fișierului (implicit text, cu tab între coloane). |
HEADER |
Prima linie conține numele coloanelor. |
DELIMITER ';' |
Separatorul de coloane (implicit virgulă pentru CSV). |
NULL '' |
Textul care înseamnă NULL. |
ENCODING 'UTF8' |
Codarea fișierului. |
ON_ERROR ignore |
PostgreSQL 17+: sare peste rândurile cu erori de tip. |
Ce returnează
COPY n, unde n este numărul de rânduri copiate.
Exemple
Exemplul 1: Import CSV de pe calculatorul tău cu \copy
Fișierul clienti.csv are linia de antet nume,oras,email.
\copy clienti (nume, oras, email) FROM 'clienti.csv' WITH (FORMAT csv, HEADER)
Rezultat în psql
COPY 250
Exemplul 2: Export al unei interogări în CSV
COPY (SELECT nume, oras FROM clienti WHERE oras = 'Iași' ORDER BY nume)
TO STDOUT WITH (FORMAT csv, HEADER);
Rezultat în psql
nume,oras
Ana,Iași
Ioana,Iași
Mihai,Iași
COPY 3
Exemplul 3: Import care sare peste rândurile greșite (PostgreSQL 17+)
Un rând are textul doi în coloana numerică stoc.
COPY produse (cod, nume, stoc) FROM '/var/lib/postgresql/import/produse.csv'
WITH (FORMAT csv, HEADER, ON_ERROR ignore);
Rezultat în psql
NOTICE: 1 row was skipped due to data type incompatibility
COPY 41
Greșeli frecvente
- Folosești
COPY ... FROM '/home/ana/date.csv'și primeșticould not open file: serverul caută fișierul pe mașina lui, nu pe a ta. Folosește\copy. - Pui punct și virgulă la finalul comenzii
\copy. Comenzile psql care încep cu\se termină la capătul liniei; punctul și virgulă nu este necesar. - Importi un CSV salvat din Excel cu separator
;și codare Windows-1250: adaugăDELIMITER ';'șiENCODING 'WIN1250'.
Comenzi înrudite
CREATE TABLE AS și LIKE: Creează un tabel din rezultatul unei interogări (CREATE TABLE AS) sau copiind structura altui tabel (LIKE).