COPY
Эта страница переведена при помощи нейросети GigaChat.
Изменено поведение оригинальной утилиты. Изменения описаны в рамках подраздела «Доработки Pangolin».
COPY
- копирование данных между файлом и таблицей.
Синтаксис
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
[ WHERE condition ]
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
TO { 'filename' | PROGRAM 'command' | STDOUT }
[ [ WITH ] ( option [, ...] ) ]
where option can be one of:
FORMAT format_name
FREEZE [ boolean ]
DELIMITER 'delimiter_character'
NULL 'null_string'
DEFAULT 'default_string'
HEADER [ boolean | MATCH ]
QUOTE 'quote_character'
ESCAPE 'escape_character'
FORCE_QUOTE { ( column_name [, ...] ) | * }
FORCE_NOT_NULL ( column_name [, ...] )
FORCE_NULL ( column_name [, ...] )
ON_ERROR error_action
ENCODING 'encoding_name'
LOG_VERBOSITY verbosity
Описание
COPY
перемещает данные между таблицами PostgreSQL и стандартными файлами файловой системы. COPY TO
копирует содержимое таблицы в файл, тогда как COPY FROM
копирует данные из файла в таблицу (добавляя данные к тому, что уже есть в таблице). COPY TO
также может копировать результаты запроса SELECT
.
Если указан список столбцов, COPY TO
копирует только данные из этих столбцов. При использовании COPY FROM
значения в файле вставляются по порядку в указанные столбцы таблицы. Столбцы, не указанные в списке, получают значения по умолчанию.
COPY
с именем файла указывает серверу PostgreSQL читать или записывать данные напрямую в файл.
Файл должен быть доступен пользователю PostgreSQL (пользователь, от имени которого работает сервер), и путь к файлу указывается с точки зрения сервера.
Если используется PROGRAM
, сервер запускает указанную команду и читает данные из ее стандартного вывода (при COPY FROM
) или пишет в ее стандартный ввод (при COPY TO
). Команда должна быть доступна и исполнима от имени пользователя PostgreSQL. Если указаны STDIN
или STDOUT
, данные передаются через соединение между клиентом и сервером.
Каждый запущенный COPY
отображает свой прогресс во внутреннем представлении pg_stat_progress_copy.
По умолчанию COPY
завершится ошибкой при возникновении ошибки во время обработки. В случаях, когда желательно сделать попытку загрузки всего файла наилучшим образом, можно использовать предложение ON_ERROR
, чтобы указать другое поведение.
Доработки Pangolin
Чтобы обеспечить безопасность системы путем отключения возможности копирования данных через команды COPY FROM
и COPY TO
, предусмотрен параметр enable_copy_from_to
(boolean
).
Параметр позволяет включать или отключать возможность выполнения команд COPY FROM
и COPY TO
. По умолчанию установлено значение true
, чтобы не нарушать существующие настройки пользователей.
При значении false
система запрещает операции копирования данных с использованием указанных SQL-команд, обеспечивая дополнительную защиту от несанкционированного переноса данных.
Параметры
enable_copy_from_to
- Включает (
true
) или отключает (false
) выполнение командCOPY FROM
/COPY TO
. По умолчанию установлено значениеtrue
, чтобы не нарушать существующие настройки пользователей.
table_name
- Имя существующей таблицы, при необходимости дополненное схемой.
column_name
- Необязательный список столбцов для копирования. Если не указан список столбцов, будут скопированы все столбцы таблицы, кроме сгенерированных.
query
- Команда SELECT, VALUES, INSERT, UPDATE, DELETE или MERGE, результаты которой будет скопирован. Обязательно указывается в скобках.
Для запросов
INSERT
,UPDATE
,DELETE
иMERGE
необходимо предоставить выражениеRETURNING
, а целевая связь не должна иметь условное правило, правилALSO
илиINSTEAD
, разворачивающихся в несколько операторов.
filename
- Путь к файлу ввода или вывода. Входной файл может иметь относительный или абсолютный путь, а выходной — только абсолютный. На Windows может понадобиться использовать строку
E''
и удваивать обратные слеши в пути.
PROGRAM
- Команда, которая будет выполнена. При
COPY FROM
вход читается из стандартного вывода команды, приCOPY TO
— вывод пишется в стандартный ввод команды.Команда запускается оболочкой, поэтому при передаче аргументов из ненадежных источников следует экранировать специальные символы. В целях безопасности лучше использовать фиксированную строку команды или исключить ввод от пользователя.
STDIN
- Указывает, что данные приходят от клиентского приложения.
STDOUT
- Указывает, что данные отправляются клиентскому приложению.
boolean
- Указывает, следует ли включить или отключить выбранный параметр. Можно написать
TRUE
,ON
, или 1 для включения иFALSE
,OFF
, или 0 для отключения. Значениеboolean
также может быть опущено, в этом случае предполагается значениеTRUE
.
FORMAT
- Выбирает формат данных, который будет прочитан или записан:
text
,csv
(значения, разделенные запятыми) илиbinary
. По умолчанию используетсяtext
.
FREEZE
- Загружает данные уже в «замороженном» виде, как после
VACUUM FREEZE
. Используется для ускорения начальной загрузки данных. Строки будут заморожены, только если таблица создана или очищена в текущей подтранзакции, нет открытых курсоров и нет старых снимков. Нельзя использоватьCOPY FREEZE
для партиционированных таблиц. Этот вариант допускается только вCOPY FROM
.Все остальные сессии немедленно увидят загруженные данные, что нарушает обычные правила видимости MVCC.
DELIMITER
- Задает символ, который разделяет столбцы внутри каждой строки файла. По умолчанию используется символ табуляции в текстовом формате и запятая в формате
CSV
. Должен быть один однобайтовый символ. Этот параметр не допускается при использовании форматаbinary
.
NULL
- Определяет строку, задающую значение
NULL
. По умолчанию в текстовом формате это\N
(обратная косая черта и N), а в формате CSV — пустая строка без кавычек. Пустую строку можно использовать и в текстовом формате, если не требуется различать пустые строки иNULL
. Для форматаbinary
этот параметр не допускается.ПримечаниеПри использовании
COPY FROM
, любой элемент данных, соответствующий этой строке, будет сохранен как нулевое значение, поэтому необходимо убедиться, что используется та же строка, которая использовалась сCOPY TO
.
DEFAULT
- Задает строку, представляющую значение по умолчанию. Каждый раз, когда эта строка встречается во входном файле, используется значение по умолчанию соответствующего столбца. Данная опция разрешена только в
COPY FROM
, и только если формат binary не используется.
HEADER
- Указывает, что файл содержит строку заголовка с именами каждого столбца в файле. При выводе первая строка содержит имена столбцов из таблицы. При вводе первая строка игнорируется при установке этого параметра на
true
(или эквивалентное логическое значение). Если этот параметр установлен наMATCH
, количество и названия столбцов в строке заголовка должны соответствовать фактическим именам столбцов таблицы в порядке; в противном случае возникает ошибка. Этот вариант не допускается при использовании форматаbinary
. ПараметрMATCH
действителен только для командCOPY FROM
.
QUOTE
- Указывает символ кавычек, используемый для заключения данных в кавычки. По умолчанию это символ двойных кавычек. Задаваемый символ должен быть однобайтовым. Этот параметр поддерживается только для формата
CSV
.
ESCAPE
- Задает символ, который должен появляться перед символом данных, соответствующим значению
QUOTE
. По умолчанию это то же самое, что и значениеQUOTE
(так что символ кавычки удваивается, если он появляется в данных). Это должно быть односимвольный однобайтовый символ. Этот параметр разрешен только при использовании форматаCSV
.
FORCE_QUOTE
- Принудительно заключает в кавычки все значения не
NULL
в указанных столбцах. Выводимое значениеNULL
никогда не заключается в кавычки. Если указано*
, в кавычки будут заключаться значения неNULL
во всех столбцах. Этот параметр принимает только командаCOPY TO
и только для форматаCSV
.
FORCE_NOT_NULL
- Не сопоставляет значения указанных столбцов со строкой
null
. В случае использования пустой строки по умолчанию это означает, что пустые значения будут считываться как строки нулевой длины вместо null-значений, даже если они не закавычены. Если указано*
, данная опция применяется ко всем столбцам. Эта опция допустима только вCOPY FROM
, и только при использовании формата CSV.
FORCE_NULL
- Сопоставляет значения указанных столбцов со строкой
null
, даже если она была закавычена, а при обнаружении соответствия устанавливает значение равнымNULL
. В случае использования пустой строки по умолчанию это преобразует закавыченную пустую строку вNULL
. Если указано*
, данная опция применяется ко всем столбцам. Эта опция допустима только вCOPY FROM
, и только при использовании формата CSV.
ON_ERROR
- Определяет поведение при возникновении ошибки преобразования входного значения столбца в его тип данных. Значение
error_action
stop означает отказ команды, тогда какignore
означает пропуск входной строки и продолжение обработки следующей строки. Значением по умолчанию являетсяstop
.
Параметр ignore применим только для COPY FROM
, когда FORMAT
равен text
или csv
.
В конце выполнения COPY FROM
выдается сообщение NOTICE
, содержащее количество проигнорированных строк, если хотя бы одна строка была пропущена. Когда параметр LOG_VERBOSITY
установлен в verbose, для каждой пропущенной строки выдается сообщение NOTICE
, содержащее номер строки входного файла и имя столбца, преобразование которого завершилось неудачей.
ENCODING
- Задает кодировку файла
encoding_name
. Если этот параметр опущен, используется текущая клиентская кодировка.
LOG_VERBOSITY
- Задает объем сообщений, выдаваемых командой
COPY
:default
илиverbose
. Если заданоverbose
, дополнительные сообщения выдаются в процессе обработки.
Это сейчас используется в команде COPY FROM
, когда параметр ON_ERROR
установлен в ignore
.
WHERE
- Необязательный
WHERE
имеет общую форму
WHERE condition
где condition
- любое выражение, которое оценивается с результатом типа boolean
. Любая строка, которая не удовлетворяет этому условию, не будет вставлена в таблицу. Строка удовлетворяет условию, если она возвращает истинное значение при подстановке фактических значений строки вместо любых ссылок на переменные.
В настоящее время подзапросы не допускаются в выражениях WHERE
, и оценка не видит никаких изменений, внесенных самим COPY
(это важно, когда выражение содержит вызовы функций VOLATILE
).
Выводимая информация
При успешном завершении команда COPY
возвращает тег команды следующего вида:
COPY count
count
- это количество скопированных строк.
psql
будет печатать этот тег команды только в том случае, если команда не была COPY ... TO STDOUT
, или эквивалентная метаоманда psql
\copy ... to stdout
. Это делается для того, чтобы не путать тег команды с данными, которые были только что напечатаны.
Примечания
COPY TO
можно использовать только с обычными таблицами (не представлениями), и она не копирует строки из дочерних таблиц или партиций. Например, COPY table TO
копирует те же строки, что и SELECT * FROM ONLY table
. Чтобы выгрузить строки из всей иерархии наследования, партиционированной таблицы или представления, используй синтаксис COPY (SELECT * FROM table) TO ...
.
COPY FROM
можно использовать с обычными, внешними, партиционированными таблицами, а также с представлениями, у которых есть триггеры INSTEAD OF INSERT
.
Для COPY TO
требуется привилегия SELECT
на таблицу (или столбцы), для COPY FROM
— привилегия INSERT
. Достаточно прав на указанные столбцы. Если включена построчная безопасность, то для COPY TO
применяются политики SELECT
.
COPY FROM
не поддерживается для таблиц с безопасностью на уровне строки — используйте INSERT
.
Указанные в COPY
файлы читаются или записываются сервером, а не клиентским приложением.
Эти файлы должны находиться на сервере или быть доступны серверу.
Они должны быть читаемыми/записываемыми пользователем PostgreSQL (а не клиентом).
Аналогично, команды с PROGRAM
выполняются сервером и должны быть исполнимы от имени пользователя PostgreSQL.
Указывать файл или команду в COPY
разрешено только суперпользователям или пользователям с ролями:
pg_read_server_files
pg_write_server_files
pg_execute_server_program
Это необходимо, так как COPY
предоставляет доступ к произвольным файлам или позволяет запускать произвольные программы.
Не путайте COPY
с командой \copy в psql
. \copy
вызывает COPY ... FROM STDIN
или TO STDOUT
и читает/записывает файл на стороне клиента. Соответственно, доступ к файлу зависит от клиента, а не сервера.
Рекомендуется всегда указывать абсолютный путь к файлу. Сервер требует абсолютный путь для COPY TO
, но COPY FROM
допускает относительный путь, который трактуется относительно рабочего каталога сервера (обычно это каталог данных кластера), а не клиента.
Выполнение команд через PROGRAM
может быть ограничено политиками безопасности ОС (например, SELinux).
COPY FROM
вызывает триггеры и проверяет ограничения, но не вызывает правила.
Для столбцов с идентификаторами COPY FROM
всегда вставляет переданные значения, аналогично INSERT ... OVERRIDING SYSTEM VALUE
.
На поведение COPY
влияет параметр DateStyle
. Чтобы обеспечить совместимость между установками PostgreSQL, следует перед использованием COPY TO
установить DateStyle = ISO
.
Также не рекомендуется использовать IntervalStyle = sql_standard
, так как отрицательные интервалы могут быть неверно интерпретированы на других серверах.
Данные при COPY
интерпретируются в соответствии с параметром ENCODING
или текущей клиентской кодировкой, даже если данные читаются/записываются напрямую сервером, без участия клиента.
Команда COPY FROM
физически вставляет входные строки в таблицу по мере своего выполнения. В случае сбоя команды эти строки остаются в удаленном состоянии; они будут невидимы, но все равно занимают место на диске. Это может привести к значительной потере дискового пространства, если сбой произошел далеко после начала большой операции копирования. Для восстановления потерянного места следует использовать команду VACUUM
.
FORCE_NULL
и FORCE_NOT_NULL
можно использовать одновременно для одного и того же столбца. Это позволяет интерпретировать пустые строки в кавычках как NULL
, а без кавычек — как пустые строки.
Форматы файлов
Текстовый формат
В этом формате данные читаются или записываются в текстовый файл — одна строка на строку таблицы. Столбцы в строке разделяются символом разделителем. Значения столбцов — это строки, создаваемые выходной функцией типа или распознаваемые входной функцией. Заданная строка NULL
заменяет значения NULL
. COPY FROM
выдаст ошибку, если в какой-либо строке файла больше или меньше столбцов, чем ожидается.
Конец данных может быть обозначен строкой: \.
(обратный слеш + точка). При чтении из файла это не требуется — конец файла обрабатывается нормально. Но маркер \.
нужен при передаче данных между клиентом и сервером через протокол до версии 3.0.
В данных можно использовать символ \
для экранирования символов, которые могли бы быть восприняты как разделители строк или столбцов.
Особенно нужно экранировать:
- сам обратный слеш (
\\
); - перевод строки (
\n
); - возврат каретки (
\r
); - символ разделитель;
- строка
NULL
(например,\N
) записывается без обратных слешей.
При чтении — сначала проверяется на совпадение со строкой NULL
, затем убираются слеши.
Поэтому \N
как NULL
и \\N
как строка \N
различаются.
Следующие специальные последовательности обратного слеша распознаются COPY FROM
:
Последовательность | Представляет |
b | Забой (ASCII 8) |
f | Подача формы (ASCII 12) |
n | Новая строка (ASCII 10) |
r | Возврат каретки (ASCII 13) |
t | Табуляция (ASCII 9) |
v | Вертикальная табуляция (ASCII 11) |
digits | Обратная косая с последующими 1–3 восьмеричными цифрами представляет байт с заданным числовым кодом |
xdigits | Обратная косая с последующим x и 1-2 шестнадцатеричными цифрами представляет байт с заданным числовым кодом |
В настоящее время COPY TO
никогда не будет выдавать последовательность обратной косой черты восьмеричной или шестнадцатеричной системы счисления, но она использует другие последовательности, перечисленные выше для этих управляющих символов.
Любой другой символ с обратной косой чертой, который не упоминается в приведенной выше таблице, будет считаться представляющим самого себя. Однако будьте осторожны при добавлении обратных слешей без необходимости, так как это может случайно привести к созданию строки, соответствующей маркеру конца данных (\.
) или пустой строке (\N
по умолчанию). Эти строки будут распознаваться до выполнения любой другой обработки обратной косой черты.
Приложениям, генерирующим данные COPY
, настоятельно рекомендуется преобразовывать символы новой строки и возврата каретки в последовательности \n
и \r
соответственно. В настоящее время возможно представить возврат каретки данных обратной косой чертой и возвратом каретки, а также представить новую строку данных обратной косой чертой и новой строкой. Однако эти представления могут быть неприемлемы в будущих выпусках. Они также очень уязвимы для повреждения, если файл COPY
передается между разными машинами (например, из Unix в Windows или наоборот).
Все последовательности обратного слеша интерпретируются после преобразования кодировки. Биты, указанные с использованием восьмеричных и шестнадцатеричных последовательностей обратных слешей, должны формировать допустимые символы в кодировке базы данных.
COPY TO
будет завершать каждую строку стилем новой строки Unix (\n
). Серверы, работающие под управлением Microsoft Windows, вместо этого выводят возврат каретки/новую строку (\r\n
), но только для COPY
на файл сервера; для обеспечения согласованности платформ, COPY TO STDOUT
всегда отправляет \n
независимо от платформы сервера. COPY FROM
может обрабатывать строки, заканчивающиеся новыми строками, возвратом каретки или комбинацией возврата каретки/новой строки. Чтобы уменьшить риск ошибки из-за необратимых новых строк или возвратов каретки, которые предназначались как данные, COPY FROM
будет жаловаться, если окончания строк во входном файле не одинаковы.
Формат CSV
Этот параметр формата используется для импорта и экспорта формата файлов с разделением запятыми (CSV
), который используется во многих других программах, таких как электронные таблицы. Вместо правил экранирования, используемых стандартным текстовым форматом PostgreSQL, он генерирует и распознает общий механизм экранирования CSV
.
Значения в каждой записи разделяются символом DELIMITER
. Если значение содержит символ разделитель, символ QUOTE
, строку NULL
, возврат каретки или символ перевода строки, то все значение предваряется и завершается символом QUOTE
, а любой экземпляр символа QUOTE
внутри значения или символа ESCAPE
предшествует управляющему символу. Также можно использовать FORCE_QUOTE
для принудительного использования кавычек при выводе значений, не являющихся NULL
в определенных столбцах.
Формат CSV
не имеет стандартного способа различать значение NULL
от пустой строки. PostgreSQL обрабатывает это с помощью кавычек. Значение NULL
выводится как строковый параметр NULL
и не заключается в кавычки, тогда как значение, не являющееся NULL
, соответствующее строке параметра NULL
, заключается в кавычки. Например, с настройками по умолчанию, NULL
записывается как непустая строка без кавычек, тогда как пустое строковое значение данных записывается в двойных кавычках (""
). Чтение значений следует аналогичным правилам. Можно использовать FORCE_NOT_NULL
для предотвращения ввода сравнений NULL
для определенных столбцов. Также можно использовать FORCE_NULL
для преобразования пустых строковых значений данных, заключенных в кавычки, в NULL
.
Поскольку обратная косая черта не является специальным символом в формате CSV
, \.
, маркер конца данных мог бы также появиться в качестве значения данных. Чтобы избежать любого неправильного толкования, значение данных \.
, появляющееся в виде отдельной записи в строке, автоматически заключается в кавычки при выводе, а при вводе, если оно заключено в кавычки, не интерпретируется как маркер конца данных. Если загружается файл, созданный другим приложением, которое имеет один незаключенный в кавычки столбец и может иметь значение \.
, может потребоваться заключить это значение в кавычки во входном файле.
В формате CSV
все символы имеют значение. Значение в кавычках, окруженное пробелами или любыми символами, отличными от DELIMITER
, будет включать эти символы. Это может вызвать ошибки, если импортировать данные из системы, которая заполняет строки CSV
пробелами до некоторой фиксированной ширины. Если возникает такая ситуация, может понадобиться предварительно обработать файл CSV
, чтобы удалить конечные пробелы перед импортом данных в PostgreSQL.
Формат CSV
будет распознавать и создавать файлы CSV
со значениями в кавычках, содержащими встроенные возвраты каретки и переводы строки. Таким образом, эти файлы не являются строго одной строкой на строку таблицы, как файлы в текстовом формате.
Многие программы генерируют странные и иногда неприемлемые файлы CSV
, так что этот формат используется скорее по соглашению, чем по стандарту. Поэтому могут встретиться файлы, которые невозможно импортировать, используя этот механизм, а COPY
может сформировать такие файлы, что их не смогут обработать другие программы.
Двоичный формат
Параметр формата binary
заставляет все данные храниться/чтение в двоичном формате, а не в виде текста. Это немного быстрее, чем текстовый и CSV
форматы, но файл в двоичном формате менее переносим между архитектурами машин и версиями PostgreSQL. Кроме того, двоичный формат очень специфичен для типа данных. Например, это не сработает при выводе двоичных данных из столбца smallint
и чтении их в столбец integer
, даже если бы это прекрасно работало в текстовом формате.
Формат файла binary
состоит из заголовка файла, нуля или более кортежей, содержащих данные строки, и окончание файла. Заголовки и данные находятся в сетевом порядке байтов.
В версиях PostgreSQL до 7.4 использовался другой двоичный формат файла.
Заголовок файла
Заголовок файла состоит из 15 байт фиксированных полей, за которыми следует область расширения заголовка переменной длины. Фиксированные поля следующие:
- Сигнатура
- Последовательность из 11 байт
- Поле флагов
- 32-битная целая маска битов для обозначения важных аспектов формата файла. Биты пронумерованы от 0 (LSB) до 31 (MSB). Обратите внимание, что это поле хранится в сетевом порядке байтов (наиболее значимый байт первым), как и все целочисленные поля, используемые в формате файла. Биты 16–31 зарезервированы для обозначения критических вопросов формата файлов; обработчик должен прервать работу, если обнаружит неожиданный установленный бит в этом диапазоне. Биты 0–15 зарезервированы для сигнализации о проблемах совместимого с предыдущими версиями формата; обработчик просто должен игнорировать любые неожиданно установленные биты в этом диапазоне. В настоящее время определен только один бит флага, а остальные должны быть равны нулю:
Бит 16 : Если 1,
OID
включены в данные; если 0, нет. Столбцы системных идентификаторовoid
больше не поддерживаются в PostgreSQL, но формат все еще содержит индикатор.
- Длина области расширения заголовка
- 32-битное целое число, длина остатка заголовка в байтах, без учета самого себя. В настоящее время это 0, и сразу за ним следует первая запись. Будущие изменения формата могут позволить наличие дополнительных данных в заголовке. обработчик должен просто пропускать все расширенные данные заголовка, о которых ему ничего не известно.
Область расширения заголовка предусмотрена для размещения последовательности самоопределяемых блоков. Поле флагов не предназначено для информирования читателей о содержимом области расширения. Конкретный дизайн содержимого расширенного заголовка оставлен для более поздней версии.
При таком подходе возможно как обратносовместимое дополнение заголовка (добавить блоки расширения заголовка или установить младшие биты флагов), так и не обратносовместимое (установить старшие биты флагов, сигнализирующие о подобном изменении, и добавить вспомогательные данные в область расширения, если это потребуется).
Записи
Каждая запись начинается с 16-битного целого числа, указывающего количество полей в записи. (В настоящее время все записи в таблице будут иметь одинаковое количество, но это может быть не всегда верно). Затем, повторяется для каждого поля в записи, есть 32-битное слово длины, за которым следует столько байтов полевых данных. Слово длины не включает себя и может быть равно нулю. В качестве особого случая, -1 указывает на нулевое значение поля. Никакие байты значения не следуют в случае NULL
.
Нет выравнивания или каких-либо других дополнительных данных между полями.
В настоящее время предполагается, что все значения данных в двоичном файле находятся в двоичном формате (код формата один). Предполагается, что будущее расширение может добавить заголовочное поле, которое позволит указывать коды формата для каждого столбца.
Чтобы определить подходящий двоичный формат фактических данных записи, нужно обратиться к исходному коду PostgreSQL, особенно к функциям *send
и *recv
для типа данных каждого столбца (обычно эти функции находятся в каталоге src/backend/utils/adt/
дистрибутива исходного кода).
Если идентификаторы объектов включены в файл, поле OID следует непосредственно за словом количества полей. Это обычное поле, за исключением того, что оно не включено в подсчет полей. Обратите внимание, что системные столбцы oid
в настоящее время не поддерживаются в текущих версиях PostgreSQL.
Окончание файла
Окончание файла состоит из 16-битного целого слова, содержащего -1. Это позволяет легко отличить его от счетчика полей в записи.
Обработчик, читающий файл, должен выдать ошибку, если число полей в записи не равно -1 или ожидаемому числу столбцов. Это обеспечивает дополнительную проверку синхронизации данных.
Примеры
В следующем примере таблица передается клиенту с разделителем полей «вертикальная черта» (|
):
COPY country TO STDOUT (DELIMITER '|');
Чтобы скопировать данные из файла в таблицу country
:
COPY country FROM '/usr1/proj/bray/sql/country_data';
Чтобы скопировать только страны, названия которых начинаются с 'A', в файл:
COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_countries.copy';
Чтобы скопировать в сжатый файл, можно передать вывод через внешнюю программу сжатия:
COPY country TO PROGRAM 'gzip > /usr1/proj/bray/sql/country_data.gz';
Вот пример данных, подходящих для копирования в таблицу из STDIN
:
AF AFGHANISTAN
AL ALBANIA
DZ ALGERIA
ZM ZAMBIA
ZW ZIMBABWE
Обратите внимание, что пробелы в каждой строке фактически являются символом табуляции.
Ниже приведены те же данные, выведенные в двоичном формате. Данные показаны после фильтрации через утилиту Unix od -c
. Таблица имеет три столбца: первый имеет тип char(2)
, второй имеет тип text
, а третий имеет тип integer
. Во всех строках в третьем столбце указано значение NULL
.
0000000 P G C O P Y \n 377 \r \n \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 003 \0 \0 \0 002 A F \0 \0 \0 013 A
0000040 F G H A N I S T A N 377 377 377 377 \0 003
0000060 \0 \0 \0 002 A L \0 \0 \0 007 A L B A N I
0000100 A 377 377 377 377 \0 003 \0 \0 \0 002 D Z \0 \0 \0
0000120 007 A L G E R I A 377 377 377 377 \0 003 \0 \0
0000140 \0 002 Z M \0 \0 \0 006 Z A M B I A 377 377
0000160 377 377 \0 003 \0 \0 \0 002 Z W \0 \0 \0 \b Z I
0000200 M B A B W E 377 377 377 377 377 377
Совместимость
В стандарте SQL нет команды COPY
.
Следующая синтаксическая конструкция использовалась до версии PostgreSQL 9.0 и все еще поддерживается:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | STDIN }
[ [ WITH ]
[ BINARY ]
[ DELIMITER [ AS ] 'delimiter_character' ]
[ NULL [ AS ] 'null_string' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'quote_character' ]
[ ESCAPE [ AS ] 'escape_character' ]
[ FORCE NOT NULL column_name [, ...] ] ] ]
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
TO { 'filename' | STDOUT }
[ [ WITH ]
[ BINARY ]
[ DELIMITER [ AS ] 'delimiter_character' ]
[ NULL [ AS ] 'null_string' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'quote_character' ]
[ ESCAPE [ AS ] 'escape_character' ]
[ FORCE QUOTE { column_name [, ...] | * } ] ] ]
Обратите внимание, что в этой синтаксической конструкции BINARY
и CSV
рассматриваются как независимые ключевые слова, а не как аргументы параметра FORMAT
.
Следующая синтаксическая конструкция использовалась до версии PostgreSQL 7.3 и все еще поддерживается:
COPY [ BINARY ] table_name
FROM { 'filename' | STDIN }
[ [USING] DELIMITERS 'delimiter_character' ]
[ WITH NULL AS 'null_string' ]
COPY [ BINARY ] table_name
TO { 'filename' | STDOUT }
[ [USING] DELIMITERS 'delimiter_character' ]
[ WITH NULL AS 'null_string' ]
Смотрите также
«Отчет о ходе выполнения команды COPY»