COPY și \copy în PostgreSQL

Modificare date și tranzacții PostgreSQL 8.0+ (opțiunile cu paranteze: 9.0+, ON_ERROR: 17+)

Importă sau exportă rapid date în format CSV sau text. COPY citește fișiere de pe server, \copy din psql citește de pe calculatorul tău.

Sintaxă SQL
COPY tabel [(coloane)] FROM 'fisier' | STDIN WITH (FORMAT csv, HEADER [, DELIMITER ';'] [, ON_ERROR ignore]);
COPY {tabel | (interogare)} TO 'fisier' | STDOUT WITH (FORMAT csv, HEADER);
\copy ... (aceeași sintaxă, fișierul este pe calculatorul tău)

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ști could 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 ';' și ENCODING '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).