COPY#

COPY

COPY

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 [, ...] )
    ENCODING 'encoding_name'

Описание

COPY перемещает данные между таблицами Tantor BE и файлами в файловой системе. COPY TO копирует содержимое таблицы в файл, а COPY FROM копирует данные из файла в таблицу (добавляя данные к уже существующим в таблице). COPY TO также может копировать результаты запроса SELECT.

Если указан список столбцов, команда COPY TO копирует только данные из указанных столбцов в файл. Для команды COPY FROM каждое поле в файле вставляется в указанный столбец в порядке следования. Столбцы таблицы, не указанные в списке столбцов COPY FROM, получат свои значения по умолчанию.

COPY с указанием имени файла указывает серверу Tantor BE на прямое чтение из файла или запись в файл. Файл должен быть доступен пользователю Tantor BE (ID пользователя, от имени которого работает сервер), и имя файла должно быть указано с точки зрения сервера. Когда указано PROGRAM, сервер выполняет указанную команду и читает из стандартного вывода программы или записывает в стандартный ввод программы. Команда должна быть указана с точки зрения сервера и быть исполняемой пользователем Tantor BE. Когда указано STDIN или STDOUT, данные передаются через соединение между клиентом и сервером.

Каждый запущенный бэкенд, выполняющий команду COPY, будет отображать свой прогресс в представлении pg_stat_progress_copy. Подробности см. в разделе Раздел 26.4.3.

Параметры

table_name

Имя (опционально с указанием схемы) существующей таблицы.

column_name

Необязательный список столбцов для копирования. Если список столбцов не указан, будут скопированы все столбцы таблицы, за исключением генерируемых столбцов.

query

A SELECT, VALUES, INSERT, UPDATE, или DELETE команда, результаты которой должны быть скопированы. Обратите внимание, что вокруг запроса требуются скобки.

Для запросов INSERT, UPDATE и DELETE необходимо указать клаузу 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 для секционированной таблицы.

Обратите внимание, что все другие сессии сразу смогут увидеть данные, как только они будут успешно загружены. Это нарушает обычные правила видимости MVCC, и пользователи должны быть осведомлены о потенциальных проблемах, которые это может вызвать.

DELIMITER

Указывает символ, который разделяет столбцы в каждой строке файла. По умолчанию это символ табуляции в текстовом формате, запятая в формате CSV. Этот символ должен быть однобайтовым. Этот параметр не разрешен при использовании формата binary.

NULL

Указывает строку, которая представляет собой значение null. По умолчанию используется \N (обратная косая черта-N) в текстовом формате и не заключенная в кавычки пустая строка в формате CSV. Возможно, вы предпочтете пустую строку даже в текстовом формате для случаев, когда вы не хотите различать null и пустые строки. Этот параметр не разрешен при использовании формата binary.

Примечание

При использовании команды COPY FROM любой элемент данных, соответствующий этой строке, будет сохранен как значение null, поэтому убедитесь, что вы используете ту же самую строку, что и при использовании команды COPY TO.

DEFAULT

Указывает строку, представляющую значение по умолчанию. Каждый раз, когда строка встречается во входном файле, будет использоваться значение по умолчанию для соответствующего столбца. Этот параметр разрешен только в COPY FROM и только при использовании не binary формата.

HEADER

Указывает, что файл содержит строку заголовка с именами каждого столбца в файле. При выводе первая строка содержит имена столбцов из таблицы. При вводе первая строка отбрасывается, когда эта опция установлена в true (или эквивалентное логическое значение). Если эта опция установлена в MATCH, количество и имена столбцов в строке заголовка должны соответствовать фактическим именам столбцов таблицы в заданном порядке; в противном случае возникает ошибка. Эта опция не разрешена при использовании формата binary. Опция MATCH действительна только для команд COPY FROM.

QUOTE

Указывает символ кавычек, который будет использоваться при заключении значения данных в кавычки. По умолчанию используется двойная кавычка. Это должен быть однобайтовый символ. Этот параметр разрешен только при использовании формата CSV.

ESCAPE

Указывает символ, который должен появиться перед символом данных, соответствующим значению QUOTE. По умолчанию это значение такое же, как и значение QUOTE (так что символ кавычки удваивается, если он появляется в данных). Это должен быть однобайтовый символ. Этот параметр разрешен только при использовании формата CSV.

FORCE_QUOTE

Принудительно использует кавычки для всех значений, кроме NULL, в каждом указанном столбце. Значение NULL никогда не заключается в кавычки. Если указано *, непустые значения будут заключены в кавычки во всех столбцах. Этот параметр разрешен только в COPY TO и только при использовании формата CSV.

FORCE_NOT_NULL

Не сопоставлять значения указанных столбцов с пустой строкой. В случае, когда пустая строка является значением по умолчанию, это означает, что пустые значения будут считываться как строки нулевой длины, а не как значения null, даже если они не заключены в кавычки. Этот параметр разрешен только в команде COPY FROM и только при использовании формата CSV.

FORCE_NULL

Соответствуйте значения указанных столбцов пустой строке, даже если она была в кавычках, и если найдено совпадение, установите значение в NULL. В случае, когда пустая строка пуста по умолчанию, это преобразует пустую строку в кавычках в NULL. Этот параметр разрешен только в COPY FROM и только при использовании формата CSV.

ENCODING

Указывает, что файл закодирован в encoding_name. Если этот параметр не указан, используется текущая кодировка клиента. См. Примечания ниже для получения дополнительной информации.

WHERE

Опциональная WHERE фраза имеет общую форму

WHERE condition

где условие - это любое выражение, которое вычисляется в результат типа boolean. Любая строка, которая не удовлетворяет этому условию, не будет вставлена в таблицу. Строка удовлетворяет условию, если она возвращает true, когда фактические значения строки подставляются вместо любых ссылок на переменные.

В настоящее время подзапросы не разрешены в выражениях 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.

Необходимо иметь привилегию на выполнение операции SELECT для таблицы, значения которой считываются с помощью COPY TO, а также привилегию на выполнение операции INSERT для таблицы, в которую значения вставляются с помощью COPY FROM. Достаточно иметь привилегии на столбцы, указанные в команде.

Если для таблицы включена политика защиты на уровне строк, соответствующие политики SELECT будут применяться к операторам COPY table TO. В настоящее время оператор COPY FROM не поддерживается для таблиц с политикой защиты на уровне строк. Вместо этого используйте эквивалентные операторы INSERT.

Файлы, указанные в команде COPY, читаются или записываются непосредственно сервером, а не клиентским приложением. Поэтому они должны находиться на сервере базы данных или быть доступными для нее, а не для клиента. Они должны быть доступными и читаемыми или записываемыми пользователем Tantor BE (ID пользователя, от имени которого работает сервер), а не клиентом. Аналогично, команда, указанная с помощью PROGRAM, выполняется непосредственно сервером, а не клиентским приложением, и должна быть исполняемой пользователем Tantor BE. Команда COPY, указывающая на файл или команду, разрешена только для суперпользователей базы данных или пользователей, которым предоставлена одна из ролей pg_read_server_files, pg_write_server_files, или pg_execute_server_program, так как она позволяет читать или записывать любой файл или запускать программу, к которым сервер имеет привилегии доступа.

Не путайте COPY с инструкцией psql \copy. \copy вызывает COPY FROM STDIN или COPY TO STDOUT, а затем извлекает/сохраняет данные в файле, доступном клиенту psql. Таким образом, доступ к файлу и права доступа зависят от клиента, а не от сервера при использовании \copy.

Рекомендуется всегда указывать имя файла, используемого в COPY, как абсолютный путь. Это обязательно для COPY TO, но для COPY FROM у вас есть возможность читать из файла, указанного относительным путем. Путь будет интерпретироваться относительно рабочего каталога процесса сервера (обычно каталога данных кластера), а не рабочего каталога клиента.

Выполнение команды с использованием PROGRAM может быть ограничено механизмами контроля доступа операционной системы, такими как SELinux.

COPY FROM вызовет все триггеры и проверит ограничения на целостность в целевой таблице. Однако, правила не будут вызваны.

Для идентификационных столбцов команда COPY FROM всегда будет записывать значения столбцов, предоставленные во входных данных, как опция INSERT OVERRIDING SYSTEM VALUE.

COPY ввод и вывод зависят от DateStyle. Чтобы обеспечить переносимость на другие установки Tantor BE, которые могут использовать нестандартные настройки DateStyle, DateStyle должен быть установлен в значение ISO перед использованием COPY TO. Также рекомендуется избегать выгрузки данных с установленным значением IntervalStyle равным sql_standard, поскольку отрицательные значения интервалов могут быть неправильно интерпретированы сервером с другой настройкой IntervalStyle.

Входные данные интерпретируются в соответствии с параметром ENCODING или текущей кодировкой клиента, а выходные данные кодируются в ENCODING или текущей кодировке клиента, даже если данные не проходят через клиент, а считываются или записываются непосредственно сервером из файла.

COPY останавливает операцию при первой ошибке. Это не должно вызывать проблем в случае использования COPY TO, но целевая таблица уже получила ранее строки в COPY FROM. Эти строки не будут видимыми или доступными, но они все еще занимают место на диске. Это может привести к значительному расходованию дискового пространства, если сбой произошел в середине большой операции копирования. Возможно, вам захочется вызвать VACUUM, чтобы восстановить затраченное пространство.

FORCE_NULL и FORCE_NOT_NULL могут быть использованы одновременно для одной и той же колонки. Это приводит к преобразованию пустых строк в кавычках в значения null и пустых строк без кавычек в пустые строки.

Форматы файлов

Формат текста

Когда используется формат text, данные, считываемые или записываемые, представляют собой текстовый файл с одной строкой на каждую строку таблицы. Столбцы в строке разделяются символом-разделителем. Сами значения столбцов являются строками, генерируемыми функцией вывода или принимаемыми функцией ввода для каждого атрибута соответствующего типа данных. Вместо столбцов, которые являются null, используется указанная строка null. COPY FROM вызовет ошибку, если любая строка входного файла содержит больше или меньше столбцов, чем ожидается.

Конец данных может быть представлен одной строкой, содержащей только обратную косую черту и точку (\.). Маркер конца данных не требуется при чтении из файла, так как конец файла отлично подходит; он нужен только при копировании данных в или из клиентских приложений, использующих протокол клиента версии ниже 3.0.

Символы обратного слеша (\) могут использоваться в данных COPY для экранирования символов данных, которые могут быть восприняты как разделители строк или столбцов. В частности, следующие символы должны быть предварены обратной косой чертой, если они являются частью значения столбца: сама обратная косая черта, символ перехода строки, символ возврата каретки и текущий символ-разделитель.

В случае использования команды COPY TO указанная пустая строка передается без добавления обратных косых черт; наоборот, команда COPY FROM сопоставляет ввод с пустой строкой перед удалением обратных косых черт. Поэтому пустая строка, такая как \N, не может быть перепутана с фактическим значением данных \N (которое будет представлено как \\N).

Следующие специальные последовательности обратного слеша распознаются COPY FROM:

ПоследовательностьПредставляет
\bBackspace (ASCII 8)
\fПеревод формы (ASCII 12)
\nПеревод строки (ASCII 10)
\rВозврат каретки (ASCII 13)
\tТабуляция (ASCII 9)
\vВертикальная табуляция (ASCII 11)
\digitsОбратная косая черта, за которой следуют от одной до трех восьмеричных цифр, указывает байт с этим числовым кодом
\xdigitsОбратная косая черта x, за которой следуют одна или две шестнадцатеричные цифры, указывает байт с этим числовым кодом

В настоящее время, 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), который используется многими другими программами, такими как электронные таблицы. Вместо правил экранирования, используемых в стандартном текстовом формате Tantor BE, он создает и распознает общий механизм экранирования CSV.

Все значения в каждой записи разделены символом DELIMITER. Если значение содержит символ разделителя, символ QUOTE, строку NULL, символ возврата каретки или символ перевода строки, то весь элемент значения предваряется и заканчивается символом QUOTE, и любое вхождение символа QUOTE или символа ESCAPE внутри значения предшествует символу экранирования. Также можно использовать FORCE_QUOTE, чтобы принудительно заключить в кавычки значения, отличные от NULL, в определенных столбцах при выводе.

Формат CSV не имеет стандартного способа различать значение NULL от пустой строки. Команда COPY в Tantor BE обрабатывает это, заключая значения в кавычки. Значение NULL выводится как строка параметра NULL и не заключается в кавычки, в то время как ненулевое значение не-NULL, совпадающее со строкой параметра NULL, заключается в кавычки. Например, при использовании настроек по умолчанию, NULL записывается как пустая строка без кавычек, а пустое значение строки записывается в двойных кавычках (""). Чтение значений происходит по аналогичным правилам. Вы можете использовать FORCE_NOT_NULL, чтобы предотвратить сравнение с NULL для конкретных столбцов. Также можно использовать FORCE_NULL, чтобы преобразовать заключенные в кавычки значения пустых строк в NULL.

Поскольку обратная косая черта не является специальным символом в формате CSV конечный маркер данных \. также может появиться в качестве значения данных. Чтобы избежать неправильной интерпретации, значение данных \., появляющееся как отдельная запись в строке, автоматически заключается в кавычки при выводе и, при вводе, если заключено в кавычки, не интерпретируется как конечный маркер данных. Если вы загружаете файл, созданный другим приложением, в котором есть один не заключенный в кавычки столбец и может быть значение \., вам может потребоваться заключить это значение в кавычки во входном файле.

Примечание

В формате CSV все символы имеют значение. Значение, заключенное в кавычки и окруженное пробелами или любыми символами, отличными от DELIMITER, будет включать эти символы. Это может вызвать ошибки при импорте данных из системы, которая добавляет пробелы в конец строк CSV до определенной ширины. Если возникнет такая ситуация, вам может потребоваться предварительная обработка файла CSV для удаления конечных пробелов перед импортом данных в Tantor BE.

Примечание

CSV формат будет как распознавать, так и создавать CSV файлы с заключенными в кавычки значениями, содержащими встроенные возвраты каретки и переводы строк. Таким образом, файлы не являются строго одной строкой на каждую строку таблицы, как файлы в текстовом формате.

Примечание

Многие программы создают странные и иногда извращенные CSV файлы, поэтому формат файла скорее является условностью, чем стандартом. Таким образом, вы можете столкнуться с файлами, которые не могут быть импортированы с использованием этого механизма, и COPY может создавать файлы, которые другие программы не могут обработать.

Бинарный формат

Опция формата binary приводит к сохранению/чтению всех данных в бинарном формате, а не в текстовом. Этот формат немного быстрее, чем форматы текста и CSV, но файл в бинарном формате менее переносим между архитектурами машин и версиями Tantor BE. Кроме того, бинарный формат очень зависит от типа данных; например, нельзя вывести бинарные данные из столбца smallint и прочитать их в столбец integer, хотя это работало бы в текстовом формате.

Формат файла binary состоит из заголовка файла, нуля или более кортежей, содержащих данные строк, и завершающего блока файла. Заголовки и данные представлены в сетевом порядке байтов.

Примечание

Tantor BE релизы до 7.4 использовали другой бинарный формат файла.

Заголовок файла

Заголовок файла состоит из 15 байт фиксированных полей, за которыми следует область расширения заголовка переменной длины. Фиксированные поля включают:

Signature

11-байтная последовательность PGCOPY\n\377\r\n\0 — обратите внимание, что нулевой байт является обязательной частью сигнатуры. (Сигнатура предназначена для облегчения идентификации файлов, которые были изменены неправильной передачей данных в 8-битном формате. Эта сигнатура будет изменена фильтрами перевода конца строки, удалением нулевых байтов, удалением старших битов или изменением четности).

Flags field

32-битная целочисленная маска битов для обозначения важных аспектов формата файла. Биты нумеруются от 0 (наименее значимый бит, LSB) до 31 (наиболее значимый бит, MSB). Обратите внимание, что это поле хранится в сетевом порядке байтов (сначала наиболее значимый байт), также как и все целочисленные поля, используемые в формате файла. Биты 16-31 зарезервированы для обозначения критических проблем формата файла; считыватель должен прервать работу, если он обнаружит неожиданный установленный бит в этом диапазоне. Биты 0-15 зарезервированы для обозначения обратносовместимых проблем формата; считыватель должен просто игнорировать любые неожиданные установленные биты в этом диапазоне. В настоящее время определен только один флаговый бит, и остальные должны быть нулевыми:

Bit 16

Если 1, OIDs включены в данные; если 0, то нет. Системные столбцы Oid больше не поддерживаются в Tantor BE, но формат все еще содержит индикатор.

Header extension area length

32-битное целое число, длина в байтах оставшейся части заголовка, не включая сам заголовок. В настоящее время это значение равно нулю, и первый кортеж следует сразу же. В будущем изменения формата могут позволить наличие дополнительных данных в заголовке. Процесс чтения должен беззвучно пропускать любые данные расширения заголовка, с которыми он не знает, что делать.

Расширенная область заголовка предполагает содержание последовательности самоопределяющихся фрагментов. Поле флагов не предназначено для информирования читателей о содержимом области расширения. Конкретное проектирование содержимого расширения заголовка оставлено на более поздний релиз.

Этот дизайн позволяет как для обратной совместимости добавлять заголовочные расширения (добавлять чанки расширений заголовка или устанавливать флаги низкого порядка), так и для несовместимых изменений (устанавливать флаги высокого порядка для сигнализации таких изменений и добавлять необходимые данные в область расширения, если требуется).

Кортежи

Каждый кортеж начинается с 16-битного целого числа, указывающего количество полей в кортеже. (В настоящее время все кортежи в таблице будут иметь одинаковое количество полей, но это может не всегда быть так). Затем, для каждого поля в кортеже, повторяется 32-битное слово длины, за которым следуют столько байтов данных поля. (Слово длины не включает само себя и может быть равно нулю). В качестве особого случая, -1 указывает на значение NULL поля. В случае NULL нет последующих байтов значений.

Между полями отсутствует выравнивание, заполнение или какие-либо другие дополнительные данные.

В настоящее время предполагается, что все значения данных в файле в двоичном формате находятся в двоичном формате (код формата один). Предполагается, что будущее расширение может добавить поле заголовка, которое позволит указывать коды формата для каждого столбца.

Для определения соответствующего двоичного формата для фактических данных кортежа следует обратиться к исходному коду Tantor BE, в частности к функциям *send и *recv для каждого типа данных столбца (обычно эти функции находятся в каталоге src/backend/utils/adt/ исходного дистрибутива).

Если OID включены в файл, поле OID следует сразу за словом field-count. Это обычное поле, за исключением того, что оно не включено в field-count. Обратите внимание, что системные столбцы oid не поддерживаются в текущих версиях Tantor BE.

Файловый трейлер

Файловый трейлер состоит из 16-битного целого числа, содержащего -1. Это легко отличается от слова, содержащего количество полей кортежа.

Процесс чтения должен сообщить об ошибке, если слово field-count не равно ни -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.

Следующий синтаксис использовался до версии Tantor BE 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' ]

См. также

Раздел 26.4.3