Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

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

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

Указать двоичный формат также можно с помощью выражения FORMAT следующим образом: FORMAT 'binary'.

Более подробную информацию можно получить в разделе Использование двоичного формата

table_name

Имя существующей таблицы

column_name

Опциональный список колонок для копирования.

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

Если список не указан, копируются все колонки таблицы

query

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

filename

Путь ко входному или выходному файлу.

В качестве пути входного файла можно использовать абсолютный или относительный путь, а в качестве пути выходного файла — только абсолютный путь. Файл должен быть доступен на мастер-хосте. Путь должен указывать на расположение в файловой системе мастер-хоста.

Более подробную информацию можно получить в разделе Загрузка данных из файлов / в файлы

PROGRAM '<command>'

Команда для запуска.

При использовании COPY FROM входные данные поступают из стандартного вывода указанной команды, а при использовании COPY TO — записываются в стандартный ввод команды. Команда должна быть указана так, как если бы она была непосредственно введена на мастер-хосте Greengage DB, и должна быть исполняемой суперпользователем.

Более подробную информацию можно получить в разделе Загрузка данных с помощью программы

STDIN | STDOUT

STDIN указывает, что ввод данных осуществляется из клиентского приложения. STDOUT указывает, что вывод данных осуществляется в клиентское приложение.

Использование выражения ON SEGMENT совместно с STDIN или STDOUT не поддерживается.

Более подробную информацию можно получить в разделе Загрузка данных через стандартные потоки ввода / вывода

ON SEGMENT

Указывает, что загрузка или выгрузка данных осуществляется через отдельные файлы, расположенные на сегмент-хостах.

Более подробную информацию можно получить в разделе Использование выражения ON SEGMENT

WITH <option>

Перечисляет дополнительные опции, описанные ниже. Ключевое слово WITH необязательно

Возможные значения option:

Параметр Описание

FORMAT 'text' | 'csv' | 'binary'

Указывает формат данных и может принимать значения text, csv или binary.

Указать двоичный формат также можно с помощью специального ключевого слова BINARY следующим образом:

COPY BINARY <table_name> [(<column_name> [, ...])]
...

Более подробную информацию о форматах данных можно получить в статье Форматирование внешних данных

OIDS [ <boolean> ]

Указывает, копировать ли идентификатор объекта (OID) для каждой строки.

Возвращается ошибка, если OIDS указан для таблицы, которая не имеет OID, или при копировании запроса

FREEZE [ <boolean> ]

Указывает, что копирование данных происходит с "замораживанием" строк, как если бы была выполнена команда VACUUM FREEZE. Это может повысить производительность первоначальной загрузки данных. Строки замораживаются только в случае, если таблица, в которую выполняется загрузка, создана или опустошена в текущей подтранзакции, нет открытых курсоров и нет более старых снепшотов, удерживаемых этой транзакцией.

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

Более подробную информацию об операции VACUUM можно получить в статье Удаление устаревших строк с помощью VACUUM

DELIMITER '<delimiter_character>'

Указывает ASCII-символ, использующийся в качестве разделителя. Разделитель должен располагаться между полями, но не в начале и не в конце строки.

Вы также можете указать непечатаемый ASCII-символ или Unicode-символ, например \x1B или \u001B. Для непечатаемых символов также поддерживается синтаксис экранирования строк вида E'<код символа>'. ASCII- или Unicode-символ должен быть заключен в одинарные кавычки, например, E'\x1B' или E'\u001B'.

Для текстовых файлов по умолчанию используется знак табуляции (0x09).

Для CSV-файлов по умолчанию используется знак запятой (,).

Более подробную информацию можно получить в разделе Форматирование столбцов

NULL '<null_string>'

Указывает строку, обозначающую null-значение — неизвестное значение колонки или поля.

Для текстовых файлов по умолчанию используется строка \N.

Для CSV-файлов по умолчанию используется пустое значение, не заключенное в кавычки.

Более подробную информацию можно получить в разделе Обработка NULL-значений

HEADER [ <boolean> ]

Указывает на наличие заголовка в файле данных.

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

QUOTE '<quote_character>'

Указывает символ кавычек. По умолчанию используется знак двойных кавычек (")

NEWLINE '<newline_character>'

Указывает символ переноса строки и принимает значения LF (символ перевода строки, 0x0A), CR (символ возврата каретки, 0x0D) или CR, совмещенный с LF (CRLF, 0x0D 0x0A).

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

Более подробную информацию можно получить в разделе Форматирование строк

ESCAPE '<escape_character>'

Указывает символ экранирования.

Для текстовых файлов по умолчанию используется знак обратной косой черты (\). Экранирование можно отключить, указав значение OFF.

Для CSV-файлов по умолчанию используется знак кавычек (").

Более подробную информацию можно получить в разделе Символы экранирования

FORCE_QUOTE { ( <column_name> [, …​] ) | * }

Заключает в кавычки все отличные от NULL значения в указанных колонках.

Если в качестве значения указан символ *, все отличные от NULL значения заключаются в кавычки во всех колонках. Значения NULL в кавычки не заключаются

FORCE_NOT_NULL ( <column_name> [, …​] )

Позволяет обрабатывать значения полей как заключенные в кавычки. Так как null-значение по умолчанию — пустое значение, не заключенное в кавычки, это позволяет обрабатывать отсутствующие значения как пустые строки

FORCE_NULL ( <column_name> [, …​] )

Сопоставляет значения указанных столбцов с null-строкой. При совпадении значение устанавливается в NULL, даже если оно заключено в кавычки. По умолчанию, когда null-строка пуста, заключенная в кавычки пустая строка преобразуется в NULL

ENCODING '<encoding_name>'

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

Более подробную информацию можно получить в разделе Кодировка символов

FILL MISSING FIELDS

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

LOG ERRORS

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

Информация хранится внутри Greengage DB, а чтобы просмотреть ее, воспользуйтесь встроенной SQL-функцией gp_read_error_log(), передав в качестве аргумента имя таблицы (<table_name>).

Более подробную информацию можно получить в разделе Запуск в режиме изоляции ошибок

SEGMENT REJECT LIMIT <count> [ ROWS | PERCENT ]

Запускает команду COPY FROM в режиме изоляции ошибок для одной строки. В качестве значения можно указать общее количество строк (по умолчанию) либо процент от общего количества строк (от 1 до 100).

Более подробную информацию можно получить в разделе Запуск в режиме изоляции ошибок

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.

См. также