![]() |
![]() |
![]() |
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' ] Параметры
Результаты
Описание Команда 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 |
![]() |
![]() |
![]() |