Самоучитель по SQL-сервер в Linux

         

COPY

Копирование данных между файлами и таблицами.

Синтаксис

COPY [ BINARY ] таблица [ WITH OIDS ]

FROM { 'файл' | stdin }

[ [ USING ] DELIMITERS 'разделитель' ]

[ WITH NULL AS ' строка _null' ] COPY [BINARY ] table [ WITH OIDS ]

TO { 'файл' | stdout }

[ [ USING ] DELIMITERS 'разделитель' ]

[ WITH NULL AS 'строка_null' ]

Параметры

  • BINARY. Ключевое слово BINARY означает, что при сохранении и чтении данных командой COPY должен использоваться внутренний двоичный формат PostgreSQL (вместо текстового). При использовании двоичного формата ключевые слова WITH NULL и DELIMITERS неприменимы.
  • таблица. Имя существующей таблицы, в которую (или из которой) копируются



    данные.
  • FROM. Ключевое слово FROM означает, что команда COPY копирует данные из файла или стандартного ввода в таблицу.
  • ТO. Ключевое слово ТO означает, что команда COPY копирует данные из таблицы в файл или стандартный вывод.
  • WITH OIDS. Необязательный признак копирования идентификатора объекта (OID). Означает, что при выборке или вставке (в зависимости от разновидности команды, COPY FROM или COPY TO) записи сохраняют исходное значение OID.
  • файл. Абсолютный путь к файлу, используемому для ввода пли вывода (например, /usr/local/pgsql/data/employeetable).
  • stdin. Если вместо имени файла указано ключевое слово stdin, данные не загружаются из файла, а передаются клиентским приложением. Если ввод данных осуществляется в клиенте psql, то при вызове команды COPY FROM с ключевым словом stdin вам будет предложено ввести нужный текст.
  • stdout. Направление данных в стандартный вывод. Если вместо имени файла указано ключевое слово stdout, данные не направляются в файл, а передаются непосредственно клиентской программе (например, psql).
  • разделитель. Символ, разделяющий значения полей. При выполнении команды COPY FROM PostgreSQL предполагает, что этот символ разделяет значения полей во входных данных. При выполнении команды COPY TO символ разделяет значения полей в выходных данных. Если разделитель не задан, по умолчанию используется символ табуляции (\t). Разделитель должен состоять из одного символа. Если заданное значение состоит из нескольких символов, PostgreSQL использует только первый символ.
  • строка_null. Последовательность символов, идентифицирующая псевдозначение NULL. По умолчанию используется \N, но вы можете выбрать другое представление, в большей степени соответствующее вашим целям. При копировании данных в таблицу все строки, совпадающие с этой строкой, интерпретируются как NULL, поэтому очень важно, чтобы строковое представление NULL при импортировании и экспортировании данных совпадало и никогда не использовалось в других целях.

Результаты

  • COPY. Сообщение выдается при успешном выполнении команды COPY.
  • NOTICE: ERROR. Ошибка — процедура копирования завершилась неудачей (с объяснением причины).

Описание

Команда COPY используется для обмена данных между таблицами баз PostgreSQL и файлами в файловой системе. Существует два варианта команды: COPY TO и COPY FROM.

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

ПРИМЕЧАНИЕ

He путайте команду SQL COPY с командой psql \copy. Команда \copy выполняет операцию COPY FROM stdin или COPY TO stdout, при этом данные хранятся в файле, доступном для psql. Следовательно, права доступа к файлу определяются клиентом, а не серверным процессом postmaster.

За дополнительной информацией об этой команде обращайтесь к разделу «Добавление данных командами INSERT и COPY» в главе 4.

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

Ограничения

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

С другой стороны, при записи или чтении данных из системного файла пользователь, запустивший сервер PostgreSQL (postmaster), должен обладать необходимыми правами доступа к заданному файлу. Чтобы обойти это ограничение, в psql можно воспользоваться командой \copy (см. главу 6).

При выполнении команды COPY TO проверяются ограничения и приводятся в действие триггеры, но не вызываются правила и не применяются значения полей по умолчанию.

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

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

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

Если в команду COPY была включена секция WITH 01DS, в начале каждой записи выводится идентификатор объекта. Если выходной файл создавался с секцией WITH OIDS, то команда импортирования данных обратно в PostgreSQL также должна содержать секцию WITH OIDS. В противном случае идентификатор будет интерпретирован как обычное поле.

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

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

Примеры

Следующая команда копирует содержимое таблицы employees в файл emp_table с разделением полей символом |:

booktown=# COPY employees TO '/tmp/employee_data' USING DELIMITERS '|';

COPY

Копирование данных из файла в таблицу publishers:

booktown=# COPY publishers FROM Vtmp/publisher_data';

COPY




Содержание раздела