COPY
Копирует данные между файлом и таблицей. Подробное описание и примеры использования см. в статье Команда COPY.
Синтаксис
COPY <table_name> [ ( <column_name> [, ...] ) ]
FROM { '<filename>' | PROGRAM '<command>' | STDIN }
[ [ WITH ] ( <option> [, ...] ) ]
[ ON SEGMENT ]
COPY { <table_name> [ ( <column_name> [, ...] ) ] | ( <query> ) }
TO { '<filename>' | PROGRAM '<command>' | STDOUT }
[ [ WITH ] ( <option> [, ...] ) ]
[ ON SEGMENT ]
где option может быть одним из:
FORMAT 'text' | 'csv' | 'binary'
OIDS [ <boolean> ]
FREEZE [ <boolean> ]
DELIMITER '<delimiter_character>'
NULL '<null_string>'
HEADER [ <boolean> ]
QUOTE '<quote_character>'
NEWLINE '<newline_character>'
ESCAPE '<escape_character>'
FORCE_QUOTE { ( <column_name> [, ...] ) | * }
FORCE_NOT_NULL ( <column_name> [, ...] )
FORCE_NULL ( <column_name> [, ...] )
ENCODING '<encoding_name>'
FILL MISSING FIELDS
[LOG ERRORS] SEGMENT REJECT LIMIT <count> [ ROWS | PERCENT ]
IGNORE EXTERNAL PARTITIONS
Описание
Команда COPY перемещает данные между таблицами Greengage DB и файлами стандартной файловой системы.
COPY TO копирует содержимое таблицы в файл (или в несколько файлов по идентификатору сегмента, если указано ON SEGMENT), а COPY FROM копирует данные из файла в таблицу (добавляя данные к уже существующим в таблице).
COPY TO также может копировать результаты запроса SELECT.
Если указан список столбцов, COPY будет копировать данные только указанных столбцов в файл или из файла.
Если в таблице есть столбцы, не входящие в список, COPY FROM вставит для этих столбцов значения по умолчанию.
Команда COPY с именем файла предписывает мастер-экземпляру Greengage DB читать или записывать непосредственно в файл.
Файл должен быть доступен мастер-хосту, а путь интерпретироваться относительно файловой системы мастер-хоста.
Когда COPY используется с выражением ON SEGMENT, команда COPY TO приводит к тому, что сегменты создают отдельные файлы, ориентированные на сегменты, которые остаются на хостах сегментов.
Аргумент имени файла для ON SEGMENT принимает обязательный строковый литерал <SEGID> и использует либо абсолютный путь, либо строковый литерал <SEG_DATA_DIR>.
При выполнении операции COPY идентификаторы сегментов и пути к каталогам данных сегментов подставляются вместо строковых литералов.
Использование COPY TO с реплицируемой таблицей (DISTRIBUTED REPLICATED) в качестве источника создает файл со строками из одного сегмента, так что целевой файл не содержит дублирующихся строк.
Использование COPY TO с выражением ON SEGMENT и реплицируемой таблицей в качестве источника создает на хостах сегментов целевые файлы, содержащие все строки таблицы.
Выражение ON SEGMENT позволяет копировать данные таблицы в файлы на хостах сегментов для использования в таких операциях, как миграция данных между кластерами или выполнение резервного копирования.
Данные сегментов, созданные выражением ON SEGMENT, могут быть восстановлены с помощью таких инструментов, как gpfdist, что полезно для высокоскоростной загрузки данных.
Использование выражения ON SEGMENT рекомендуется только для опытных пользователей.
Когда указан PROGRAM, сервер выполняет заданную команду и читает из стандартного вывода программы или записывает в стандартный ввод программы.
Команда должна быть указана относительно файловой системы сервера и быть исполняемой пользователем gpadmin.
Когда указаны STDIN или STDOUT, данные передаются через соединение между клиентом и мастером.
STDIN и STDOUT нельзя использовать с выражением ON SEGMENT.
Если используется SEGMENT REJECT LIMIT, то операция COPY FROM будет работать в режиме изоляции ошибок отдельных строк.
Режим изоляции ошибок отдельных строк применяется только к строкам во входном файле с ошибками формата — например, лишние или отсутствующие атрибуты, атрибуты неверного типа данных или недопустимые последовательности кодировки клиента.
Ошибки ограничений, такие как нарушение ограничений NOT NULL, CHECK или UNIQUE, обрабатываются в режиме ввода "все или ничего".
Пользователь может указать допустимое количество ошибочных строк на сегмент, после чего вся операция COPY FROM будет отменена и ни одна строка не будет загружена.
Подсчет ошибочных строк ведется для каждого сегмента, а не для всей операции загрузки.
Если предельное количество ошибок на сегмент не достигнуто, то все строки, не содержащие ошибок, будут загружены, а любые ошибочные строки — отброшены.
Чтобы сохранить ошибочные строки для дальнейшего изучения, укажите выражение LOG ERRORS для сбора информации журнала ошибок.
Информация об ошибке и строка сохраняются внутри Greengage DB.
Выводимая информация
При успешном завершении команда COPY возвращает тег команды следующего вида, где count — количество скопированных строк:
COPY <count>
Если команда COPY FROM выполняется в режиме изоляции ошибок отдельных строк, будет возвращено следующее уведомительное сообщение, если какие-либо строки не были загружены из-за ошибок формата, где count — количество отклоненных строк:
NOTICE: Rejected <count> badly formatted rows.
Параметры
| Параметр | Описание |
|---|---|
BINARY |
Включает режим чтения или записи данных в двоичном формате. Указать двоичный формат также можно с помощью выражения Более подробную информацию можно получить в разделе Использование двоичного формата |
table_name |
Имя существующей таблицы |
column_name |
Опциональный список колонок для копирования. Если список указан, команда Если список не указан, копируются все колонки таблицы |
query |
Команда |
filename |
Путь ко входному или выходному файлу. В качестве пути входного файла можно использовать абсолютный или относительный путь, а в качестве пути выходного файла — только абсолютный путь. Файл должен быть доступен на мастер-хосте. Путь должен указывать на расположение в файловой системе мастер-хоста. Более подробную информацию можно получить в разделе Загрузка данных из файлов / в файлы |
PROGRAM '<command>' |
Команда для запуска. При использовании Более подробную информацию можно получить в разделе Загрузка данных с помощью программы |
STDIN | STDOUT |
Использование выражения Более подробную информацию можно получить в разделе Загрузка данных через стандартные потоки ввода / вывода |
ON SEGMENT |
Указывает, что загрузка или выгрузка данных осуществляется через отдельные файлы, расположенные на сегмент-хостах. Более подробную информацию можно получить в разделе Использование выражения ON SEGMENT |
WITH <option> |
Перечисляет дополнительные опции, описанные ниже.
Ключевое слово |
Возможные значения option:
| Параметр | Описание |
|---|---|
FORMAT 'text' | 'csv' | 'binary' |
Указывает формат данных и может принимать значения Указать двоичный формат также можно с помощью специального ключевого слова
Более подробную информацию о форматах данных можно получить в статье Форматирование внешних данных |
OIDS [ <boolean> ] |
Указывает, копировать ли идентификатор объекта (OID) для каждой строки. Возвращается ошибка, если |
FREEZE [ <boolean> ] |
Указывает, что копирование данных происходит с "замораживанием" строк, как если бы была выполнена команда Обратите внимание, что в остальных сессиях данные будут видны сразу после их успешной загрузки. Это нарушает обычные правила видимости MVCC, поэтому следует учитывать потенциальные связанные с этим проблемы. Более подробную информацию об операции |
DELIMITER '<delimiter_character>' |
Указывает ASCII-символ, использующийся в качестве разделителя. Разделитель должен располагаться между полями, но не в начале и не в конце строки. Вы также можете указать непечатаемый ASCII-символ или Unicode-символ, например Для текстовых файлов по умолчанию используется знак табуляции ( Для CSV-файлов по умолчанию используется знак запятой ( Более подробную информацию можно получить в разделе Форматирование столбцов |
NULL '<null_string>' |
Указывает строку, обозначающую null-значение — неизвестное значение колонки или поля. Для текстовых файлов по умолчанию используется строка Для CSV-файлов по умолчанию используется пустое значение, не заключенное в кавычки. Более подробную информацию можно получить в разделе Обработка NULL-значений |
HEADER [ <boolean> ] |
Указывает на наличие заголовка в файле данных. Если используются несколько файлов с данными, то все они должны иметь заголовок. По умолчанию предполагается, что заголовок в файлах данных отсутствует |
QUOTE '<quote_character>' |
Указывает символ кавычек. По умолчанию используется знак двойных кавычек ( |
NEWLINE '<newline_character>' |
Указывает символ переноса строки и принимает значения Если значение не указано, используется символ переноса строки, которым заканчивается первая строка файла данных. Более подробную информацию можно получить в разделе Форматирование строк |
ESCAPE '<escape_character>' |
Указывает символ экранирования. Для текстовых файлов по умолчанию используется знак обратной косой черты ( Для CSV-файлов по умолчанию используется знак кавычек ( Более подробную информацию можно получить в разделе Символы экранирования |
FORCE_QUOTE { ( <column_name> [, …] ) | * } |
Заключает в кавычки все отличные от Если в качестве значения указан символ |
FORCE_NOT_NULL ( <column_name> [, …] ) |
Позволяет обрабатывать значения полей как заключенные в кавычки. Так как null-значение по умолчанию — пустое значение, не заключенное в кавычки, это позволяет обрабатывать отсутствующие значения как пустые строки |
FORCE_NULL ( <column_name> [, …] ) |
Сопоставляет значения указанных столбцов с null-строкой.
При совпадении значение устанавливается в |
ENCODING '<encoding_name>' |
Определяет кодировку символов исходных данных. Если значение не указано, используется клиентская кодировка по умолчанию. Более подробную информацию можно получить в разделе Кодировка символов |
FILL MISSING FIELDS |
Устанавливает значения |
LOG ERRORS |
Включает запись в лог информации о строках данных, содержащих ошибки форматирования. Информация хранится внутри Greengage DB, а чтобы просмотреть ее, воспользуйтесь встроенной SQL-функцией Более подробную информацию можно получить в разделе Запуск в режиме изоляции ошибок |
SEGMENT REJECT LIMIT <count> [ ROWS | PERCENT ] |
Запускает команду Более подробную информацию можно получить в разделе Запуск в режиме изоляции ошибок |
IGNORE EXTERNAL PARTITIONS |
Если выражение указано, при копировании из партиционированных таблиц данные не копируются из конечных дочерних партиций, являющихся внешними таблицами. Соответствующее сообщение добавляется в лог-файл. В противном случае, если выражение не указано и Greengage DB пытается скопировать данные из конечной дочерней партиции, являющейся внешней таблицей, возвращается ошибка. Чтобы скопировать данные из партиционированной таблицы с конечной дочерней партицией, являющейся внешней таблицей, выберите данные для копирования с помощью SQL-запроса |
Примечания
Команду можно использовать только с обычными таблицами, пишущими внешними таблицами или результатом выполнения запроса SELECT, но не с читающими внешними таблицами или представлениями.
COPY работает только с конкретной указанной таблицей; она не копирует данные в дочерние таблицы или из них.
Таким образом, например, COPY table TO показывает те же данные, что и SELECT * FROM ONLY table.
Но COPY (SELECT * FROM table) TO … может использоваться для выгрузки всех данных в иерархии наследования.
Аналогично, чтобы скопировать данные из партиционированной таблицы, у которой листовая дочерняя партиция является внешней таблицей, используйте SQL-запрос для выбора данных для копирования.
Например, если таблица my_sales содержит листовую дочернюю партицию, которая является внешней таблицей, команда COPY my_sales TO stdout вернет ошибку.
Следующая команда отправит данные в stdout:
COPY (SELECT * from my_sales ) TO stdout
Указание BINARY приводит к тому, что все данные хранятся/читаются в двоичном формате, а не в текстовом.
Такой режим несколько быстрее, чем обычный текстовый режим, но файл двоичного формата менее переносим между архитектурами компьютеров и версиями Greengage DB.
Кроме того, вы не можете запускать COPY FROM в режиме изоляции ошибок отдельных строк, если данные имеют двоичный формат.
Необходимо иметь привилегию SELECT для таблицы, значения которой считываются командой COPY TO, и привилегию INSERT для таблицы, в которую значения вставляются командой COPY FROM.
Достаточно иметь привилегии на столбцы, перечисленные в команде.
Файлы, указанные в команде COPY, читаются или записываются непосредственно сервером, а не клиентским приложением.
Поэтому они должны находиться на сервере базы данных или быть доступны для него, а не для клиента.
Они должны быть доступны для чтения или записи пользователем Greengage DB (по ID пользователя, под которым работает сервер), а не клиентом.
Только суперпользователи базы данных имеют право указывать файлы в COPY, поскольку это позволяет читать или записывать любой файл, к которому сервер имеет права доступа.
COPY FROM будет вызывать любые триггеры и проверять ограничения целевой таблицы.
Однако она не будет вызывать правила перезаписи (rewrite rule).
Обратите внимание, что нарушения ограничений не оцениваются в режиме изоляции ошибок отдельных строк.
Ввод и вывод COPY зависит от конфигурационного параметра DateStyle.
Чтобы обеспечить переносимость на другие установки Greengage DB, которые могут использовать настройки DateStyle, отличные от значений по умолчанию, DateStyle следует установить в ISO перед использованием COPY TO.
Также рекомендуется избегать выгрузки данных при конфигурационном параметре IntervalStyle, установленном в sql_standard, поскольку отрицательные значения интервалов могут быть неправильно интерпретированы сервером, имеющим другую настройку для IntervalStyle.
Входные данные интерпретируются в соответствии с опцией ENCODING или текущей кодировкой клиента, а выходные данные кодируются в ENCODING или текущей кодировке клиента, даже если данные не проходят через клиента, а читаются из файла или записываются в файл непосредственно сервером.
При копировании XML-данных из файла в текстовом режиме серверный конфигурационный параметр xmloption влияет на проверку копируемых XML-данных.
Если значение равно content (по умолчанию), XML-данные проверяются как фрагмент XML-контента.
Если значение параметра равно document, XML-данные проверяются как XML-документ.
Если XML-данные невалидны, COPY возвращает ошибку.
COPY останавливает работу при первой ошибке.
Такое поведение не должно привести к проблемам в случае COPY TO, но целевая таблица уже получит более ранние строки в COPY FROM.
Эти строки не будут видимы или доступны, но они все равно занимают дисковое пространство.
Это может составить значительное количество потраченного впустую дискового пространства, если сбой произошел в процессе большой операции копирования.
Вы можете вызвать VACUUM для восстановления потраченного впустую пространства.
Другой вариант — использовать режим изоляции ошибок отдельных строк для отфильтровывания ошибочных строк при загрузке правильных строк.
FORCE_NULL и FORCE_NOT_NULL можно использовать одновременно для одного и того же столбца.
Это приводит к преобразованию строк null в кавычках в значения null, а строк null без кавычек — в пустые строки.
При выполнении команды COPY FROM … ON SEGMENT серверный конфигурационный параметр gp_enable_segment_copy_checking определяет, проверяется ли политика распределения таблицы (из выражения DISTRIBUTED таблицы) при копировании данных в таблицу.
По умолчанию проверка политики распределения включена.
Если строка данных нарушает политику распределения для экземпляра сегмента, возвращается ошибка.
Данные из таблицы, сгенерированные командой COPY TO … ON SEGMENT, могут быть использованы для восстановления данных таблицы с помощью COPY FROM … ON SEGMENT.
Однако данные, восстановленные на сегментах, распределяются в соответствии с политикой распределения таблицы на момент создания файлов командой COPY TO.
Команда COPY может вернуть ошибки политики распределения таблицы, если вы попытаетесь восстановить данные таблицы, а политика распределения таблицы была изменена после выполнения COPY FROM … ON SEGMENT.
Если вы запускаете COPY FROM … ON SEGMENT, а параметр конфигурации сервера gp_enable_segment_copy_checking имеет значение false, может потребоваться ручное перераспределение данных таблицы.
См. выражение WITH REORGANIZE команды ALTER TABLE.
При указании выражения LOG ERRORS Greengage DB записывает ошибки, возникающие при чтении данных внешней таблицы.
Вы можете просматривать и управлять полученными данными журнала ошибок.
-
Используйте встроенную SQL-функцию
gp_read_error_log('table_name'). Она требует привилегииSELECTна таблицуtable_name. В этом примере отображается информация журнала ошибок для данных, загруженных в таблицуext_expensesс помощью командыCOPY:SELECT * from gp_read_error_log('ext_expenses');Функция возвращает
FALSE, еслиtable_nameне существует. -
Если для указанной таблицы существуют данные журнала ошибок, новые данные журнала ошибок добавляются к существующим. Информация журнала ошибок не реплицируется на зеркальные сегменты.
-
Используйте встроенную SQL-функцию
gp_truncate_error_log('table_name')для удаления данных журнала ошибок дляtable_name. Она требует привилегий владельца таблицы. В следующем примере удаляется информация журнала ошибок, полученная при перемещении данных в таблицуext_expenses:SELECT gp_truncate_error_log('ext_expenses');Функция возвращает
FALSE, еслиtable_nameне существует.Укажите подстановочный символ
*, чтобы удалить информацию журнала ошибок для существующих таблиц в текущей базе данных. Укажите строку*.*, чтобы удалить всю информацию журнала ошибок базы данных, включая информацию, которая не была удалена из-за предыдущих проблем с базой данных. Если указано*, требуется привилегия владельца базы данных. Если указано*.*, требуется привилегия суперпользователя операционной системы.
Когда пользователь Greengage DB, не являющийся суперпользователем, выполняет команду COPY, командой можно управлять с помощью ресурсной очереди.
Ресурсная очередь должна быть настроена с параметром ACTIVE_STATEMENTS, который задает максимальное ограничение на количество запросов, которые могут выполняться ролями, назначенными этой очереди.
Greengage DB не применяет стоимость или значение памяти к команде COPY, поэтому очереди только с ограничениями стоимости или памяти не влияют на выполнение команд COPY.
Не суперпользователь может выполнять только следующие типы команд COPY:
-
Команду
COPY FROM, где источник —stdin. -
Команду
COPY TO, где назначение —stdout.
Подробная информация об очередях ресурсов приводится в разделе Использование ресурсных очередей.
Форматы файлов
Форматы файлов, поддерживаемые COPY.
Текстовый формат
При использовании формата text данные, читаемые или записываемые, представляют собой текстовый файл с одной строкой на каждую строку таблицы.
Столбцы в строке разделяются символом-разделителем (по умолчанию — табуляция).
Значения столбцов представляют собой строки, сгенерированные выходной функцией или приемлемые для входной функции каждого типа данных атрибута.
Указанная строка null используется вместо столбцов со значением null.
COPY FROM выдаст ошибку, если любая строка входного файла содержит больше или меньше столбцов, чем ожидается.
Если указан OIDS, OID читается или записывается как первый столбец, предшествующий пользовательским столбцам данных.
Файл данных имеет два зарезервированных символа, которые имеют особое значение для COPY:
-
Назначенный символ-разделитель (по умолчанию табуляция), который используется для разделения полей в файле данных.
-
Перевод строки в стиле UNIX (
\nили0x0a), который используется для обозначения новой строки в файле данных. Настоятельно рекомендуется, чтобы приложения, генерирующие данныеCOPY, преобразовывали переводы строк в стиле UNIX, а не в стиле Microsoft Windows (возврат каретки и перевод строки,\r\nили0x0a 0x0d).
Если ваши данные содержат любой из этих символов, вы должны экранировать его, чтобы COPY рассматривал его как данные, а не как разделитель полей или новую строку.
По умолчанию символ экранирования — \ (обратная косая черта) для файлов в текстовом формате и " (двойная кавычка) для файлов в формате CSV.
Если вы хотите использовать другой символ экранирования, вы можете сделать это с помощью выражения ESCAPE AS.
Убедитесь, что выбранный символ экранирования не используется нигде в вашем файле данных как фактическое значение данных.
Вы также можете деактивировать экранирование в файлах текстового формата, используя ESCAPE 'OFF'.
Например, предположим, что у вас есть таблица с тремя столбцами, и вы хотите загрузить следующие три поля с помощью COPY.
-
знак процента =
% -
вертикальная черта =
| -
обратная косая черта =
\
Ваш назначенный символ-разделитель — | (символ вертикальной черты), а назначенный символ экранирования — * (звездочка). Отформатированная строка в вашем файле данных будет выглядеть так:
percentage sign = % | vertical bar = *| | backslash = \
Обратите внимание, как символ вертикальной черты, который является частью данных, был экранирован с помощью символа звездочки (*).
Также обратите внимание, что вам не нужно экранировать обратную косую черту, поскольку используется альтернативный символ экранирования.
Следующие символы должны предваряться символом экранирования, если они появляются как часть значения столбца: сам символ экранирования, перевод строки, возврат каретки и текущий символ-разделитель. Вы можете указать другой символ экранирования с помощью выражения ESCAPE AS.
Формат CSV
Этот формат используется для импорта и экспорта формата файла Comma Separated Value (CSV), используемого многими другими программами, такими как электронные таблицы.
Вместо правил экранирования, используемых стандартным текстовым форматом Greengage DB, он производит и распознает распространенный механизм экранирования CSV.
Значения в каждой записи разделяются символом DELIMITER.
Если значение содержит символ разделителя, символ QUOTE, строку NULL, символ возврата каретки или перевода строки, то все значение снабжается префиксом и суффиксом символа QUOTE, а любое появление внутри значения символа QUOTE или символа ESCAPE предваряется символом ESCAPE.
Вы также можете использовать FORCE_QUOTE для принудительного использования кавычек при выводе значений, отличных от NULL, в определенных столбцах.
У формата CSV нет стандартного способа отличить значение NULL от пустой строки.
Команда COPY в Greengage DB обрабатывает это с помощью кавычек.
NULL выводится как строка параметра NULL и не заключается в кавычки, в то время как значение, отличное от NULL, совпадающее со строкой параметра NULL, заключается в кавычки.
Например, с настройками по умолчанию NULL записывается как незаключенная в кавычки пустая строка, в то время как значение данных пустой строки записывается с двойными кавычками ("").
Чтение значений следует аналогичным правилам.
Вы можете использовать FORCE_NOT_NULL, чтобы предотвратить сравнение входных данных с NULL для определенных столбцов.
Вы также можете использовать FORCE_NULL для преобразования значений данных пустой строки в кавычках в NULL.
Поскольку обратная косая черта не является специальным символом в формате CSV, маркер конца данных (\.) также может появляться как значение данных.
Чтобы избежать неправильной интерпретации, значение данных \., появляющееся как отдельная запись в строке, автоматически заключается в кавычки при выводе, а при вводе, если оно заключено в кавычки, не интерпретируется как маркер конца данных.
Если вы загружаете файл, созданный другим приложением, у которого есть один столбец без кавычек и который может иметь значение \., вам может потребоваться заключить это значение в кавычки во входном файле.
В формате CSV все символы имеют значение.
Символ пробела, окружающий разделитель, или символ в строке null, не заключенной в кавычки, включается в значение.
В идеале, если вы хотите импортировать данные из системы, которая дополняет строки CSV пробелами, вам следует удалить пробелы перед импортом данных.
Формат CSV будет распознавать и создавать CSV-файлы с закавыченными значениями, содержащими встроенные возвраты каретки и переводы строк.
Таким образом, файлы не строго состоят из одной строки на строку таблицы, как файлы текстового формата.
Многие программы создают нестандартные CSV-файлы, поэтому этот формат — скорее договоренность, чем жесткий стандарт.
В результате вы можете столкнуться с файлами, которые не получится импортировать этим механизмом, и команда COPY может создавать файлы, с которыми не справятся другие программы.
Двоичный формат
Опция формата binary приводит к тому, что все данные сохраняются/считываются в двоичном формате, а не в текстовом.
Это несколько быстрее, чем форматы text и CSV, но файл в бинарном формате менее переносим между архитектурами машин и версиями Greengage DB.
Кроме того, двоичный формат строго зависит от типов данных: например, он не позволяет загрузить данные из столбца SMALLINT, а затем выгрузить их в столбец INTEGER, хотя с текстовым форматом это возможно.
Формат файла binary включает в себя заголовок файла, ноль или более записей, содержащих данные строк, и окончание файла.
Заголовки и данные находятся в сетевом порядке байтов.
-
Заголовок файла содержит 15 байт фиксированных полей, за которыми следует область расширения заголовка переменной длины. Используются следующие фиксированные поля:
-
Сигнатура — 11-байтовая последовательность
PGCOPY\n\377\r\n\0. Обратите внимание, что нулевой байт является обязательной частью сигнатуры. Сигнатура разработана для простой идентификации файлов, которые были искажены при передаче, не сохраняющей все 8 бит. Эта сигнатура будет изменена фильтрами перевода конца строки, отброшенными нулевыми байтами, отброшенными старшими битами или изменениями четности. -
Поле флагов — 32-битная целочисленная битовая маска для обозначения важных аспектов формата файла. Биты нумеруются от
0(наименее значимый бит, LSB) до31(наиболее значимый бит, MSB). Обратите внимание, что это поле хранится в порядке байтов сети (старший байт первый), как и все целочисленные поля, используемые в формате файла. Биты16—31зарезервированы для обозначения критических особенностей формата файла; программа-чтения должна прервать работу, если обнаружит неожиданный установленный бит в этом диапазоне. Биты0—15зарезервированы для обозначения обратно совместимых особенностей формата; программа-чтения должна просто игнорировать любые неожиданные установленные биты в этом диапазоне. В настоящее время определен только один битовый флаг, остальные должны быть равны0. Бит16: если1, OID включены в данные; если0, то не включены. -
Длина области расширения заголовка — целое 32-битное число, определяющее длину в байтах остального заголовка, не включая само это значение. В настоящее время содержит
0, и сразу за ним следует первая запись. В будущих изменениях формата в заголовок могут быть добавлены дополнительные данные. Обработчик должен пропускать все неизвестные расширенные данные заголовка.
-
-
Записи (tuple) — каждая запись начинается с 16-битного целого числа, указывающего количество полей в записи. В настоящее время все записи в таблице будут иметь одинаковое количество, но это может быть не всегда так. Затем, для каждого поля в кортеже, идет 32-битное слово длины, за которым следует столько байт данных поля. Слово длины не включает себя и может быть нулевым. В особом случае
-1указывает на значение поляNULL. В случаеNULLбайты значения не следуют.Между полями нет выравнивания, заполнения или каких-либо других дополнительных данных.
В настоящее время предполагается, что все значения данных в файле двоичного формата находятся в двоичном формате (код формата один).
Если OID включены в файл, поле OID следует сразу за словом количества полей. Это обычное поле, за исключением того, что оно не включается в подсчет полей. В частности, у него есть слово длины — это позволит обрабатывать 4-байтовые и 8-байтовые OID без особых проблем и позволит показывать OID как null, если это когда-либо окажется желательным.
-
Окончание файла (file trailer) состоит из 16-битного целого, содержащего
-1. Его легко отличить от счетчика полей в записи. Обработчик, читающий файл, должен выдать ошибку, если число полей в записи не равно-1или ожидаемому числу столбцов. Это обеспечивает дополнительную проверку синхронизации данных.
Совместимость
В стандарте SQL нет оператора COPY.
Следующий синтаксис использовался до PostgreSQL версии 9.0 и все еще поддерживается:
COPY <table_name> [(<column_name> [, ...])] FROM {'<filename>' | PROGRAM '<command>' | STDIN}
[ [WITH]
[ON SEGMENT]
[BINARY]
[OIDS]
[HEADER]
[DELIMITER [ AS ] '<delimiter_character>']
[NULL [ AS ] '<null_string>']
[ESCAPE [ AS ] '<escape_character>' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[CSV [QUOTE [ AS ] '<quote_character>']
[FORCE NOT NULL <column_name> [, ...]]
[FILL MISSING FIELDS]
[[LOG ERRORS]
SEGMENT REJECT LIMIT <count> [ROWS | PERCENT] ]
COPY { <table_name> [(<column_name> [, ...])] | (<query>)} TO {'<filename>' | PROGRAM '<command>' | STDOUT}
[ [WITH]
[ON SEGMENT]
[BINARY]
[OIDS]
[HEADER]
[DELIMITER [ AS ] '<delimiter_character>']
[NULL [ AS ] '<null_string>']
[ESCAPE [ AS ] '<escape_character>' | 'OFF']
[CSV [QUOTE [ AS ] '<quote_character>']
[FORCE QUOTE <column_name> [, ...]] | * ]
[IGNORE EXTERNAL PARTITIONS ]
Обратите внимание, что в этом синтаксисе BINARY и CSV рассматриваются как независимые ключевые слова, а не как аргументы опции FORMAT.