COPY или \copy.Это быстро, потому что данные передаются одной массовой командой с минимальным количеством обменов по протоколу, одним разбором и планированием, прямым преобразованием строк и без накладных расходов на отдельный запрос для каждой строки.
Что важно знать:
FORMAT csvВключает стандартный разбор CSV: запятые, поля в кавычках и экранированные кавычки.
Список целевых столбцов
Порядок столбцов в CSV редко совпадает с таблицей. Всегда указывайте целевые столбцы в том порядке, в котором они идут в файле. Postgres сопоставляет их по позиции, а не по имени из заголовка CSV.
HEADER / HEADER nПропускает строки заголовка. Обычный
HEADER пропускает первую строку. Ожидается, что Postgres 19 позволит передавать число, например HEADER 2, чтобы пропускать несколько начальных строк.DEFAULT 'string'Позволяет сопоставить специальную строку в CSV, например
'__DEFAULT__', с выражением DEFAULT соответствующего столбца.Неуказанные столбцы
Столбцы таблицы, которые не указаны в списке целевых столбцов, автоматически получают
DEFAULT или NULL.Лишние столбцы в CSV
Postgres выдаст ошибку, если в CSV больше полей, чем указано целевых столбцов. Обрежьте файл или сначала загрузите данные в более широкую промежуточную таблицу.
NULL-значения
В формате
csv стандартным представлением NULL является пустая строка без кавычек. Это можно изменить через NULL 'string'.Обработка ошибок через
ON_ERROR и REJECT_LIMITИсторически
COPY останавливался на первой ошибке преобразования. В новых версиях появились:•
ON_ERROR ignore в Postgres 17 — пропускает некорректные строки и сообщает их количество•
REJECT_LIMIT n в Postgres 18 — задаёт максимальное число плохих строк при ON_ERROR ignore, после которого импорт будет остановлен•
ON_ERROR set_null в Postgres 19 — заменяет некорректное поле на NULL вместо того, чтобы отбрасывать всю строку

