COPY — copia dados entre um arquivo e uma tabela
COPYnome_da_tabela[ (nome_da_coluna[, ...] ) ] FROM { 'nome_do_arquivo' | PROGRAM 'comando' | STDIN } [ [ WITH ] (opção[, ...] ) ] [ WHEREcondição] COPY {nome_da_tabela[ (nome_da_coluna[, ...] ) ] | (consulta) } TO { 'nome_do_arquivo' | PROGRAM 'comando' | STDOUT } [ [ WITH ] (opção[, ...] ) ] ondeopçãopode ser uma entre: FORMATnome_do_formatoFREEZE [booleano] DELIMITER 'caractere_delimitador' NULL 'cadeia_nula' DEFAULT 'cadeia_de_caracteres_padrão' HEADER [booleano| MATCH ] QUOTE 'caractere_demarcador_de_campo' ESCAPE 'caractere_de_escape' FORCE_QUOTE { (nome_da_coluna[, ...] ) | * } FORCE_NOT_NULL { (nome_da_coluna[, ...] ) | * } FORCE_NULL { (nome_da_coluna[, ...] ) | * } ON_ERRORação_de_erroREJECT_LIMITmáximo_de_errosENCODING 'nome_da_codificação' LOG_VERBOSITYverbosidade
O comando COPY move dados entre as tabelas do
PostgreSQL e arquivos do sistema de arquivos.
O comando COPY TO copia o conteúdo de uma tabela
para um arquivo, enquanto o comando
COPY FROM copia dados de
um arquivo para uma tabela
(anexando os dados aos que já se encontram na tabela).
O comando COPY TO também pode copiar os resultados
de uma consulta SELECT.
Se for especificada uma lista de colunas, o comando
COPY TO irá copiar para o arquivo apenas os dados
das colunas listadas.
Para o comando COPY FROM, cada campo no arquivo
é inserido, em ordem, na coluna especificada.
As colunas da tabela não especificadas na lista de colunas do comando
COPY FROM, recebem seus valores padrão.
O comando COPY com nome de arquivo instrui
o servidor PostgreSQL a ler ou escrever
diretamente no arquivo.
O arquivo deve poder ser acessado pelo usuário do
PostgreSQL
(o ID de usuário com o qual o servidor executa),
e o nome deve ser especificado do ponto de vista do servidor.
Quando é especificado PROGRAM, o servidor executa
o comando indicado, e lê a saída padrão do programa, ou escreve na
entrada padrão do programa.
O comando deve ser especificado do ponto de vista do servidor, e poder
ser executado pelo usuário do PostgreSQL.
Quando é especificado STDIN ou
STDOUT, os dados são transmitidos através da
conexão entre o cliente e o servidor.
Cada processo servidor executando o comando COPY
relata seu progresso na visão
pg_stat_progress_copy.
Veja Relatório de progresso do COPY para obter detalhes.
Por padrão, o comando COPY irá falhar se
encontrar um erro durante o processamento.
Para casos de uso em que se deseja uma tentativa de carregar o
arquivo inteiro da melhor maneira possível, pode ser usada a
cláusula ON_ERROR para especificar algum outro
comportamento.
nome_da_tabelaO nome da tabela (opcionalmente qualificado pelo esquema).
nome_da_colunaA lista opcional de colunas a serem copiadas. Se não for especificada nenhuma lista de colunas, todas as colunas da tabela, exceto as colunas geradas, serão copiadas.
consulta
O comando SELECT,
VALUES,
INSERT,
UPDATE,
DELETE ou
MERGE
cujos resultados devem ser copiados.
Note ser necessário o uso de parênteses em torno da consulta.
Para as consultas
INSERT, UPDATE,
DELETE e MERGE
deve ser fornecida a cláusula RETURNING,
e a relação de destino não deve ter uma regra condicional,
nem uma regra ALSO,
nem uma regra INSTEAD
que se expande para múltiplas declarações.
nome_do_arquivoO nome do caminho do arquivo de entrada ou saída. O nome do arquivo de entrada pode ser um caminho absoluto ou relativo, mas o nome do arquivo de saída deve ser um caminho absoluto. Os usuários do Windows podem precisar usar uma cadeia de caracteres E'', e todas as contrabarras usadas no nome do caminho duplicadas.
PROGRAM
O comando a ser executado.
No comando COPY FROM, a entrada é lida da saída
padrão do comando, e no comando COPY TO,
a saída é escrita na entrada padrão do comando.
Note que o comando é chamado pelo interpretador de comandos (shell), portanto, se for necessário passar quaisquer argumentos para o comando que venham de uma fonte não confiável, deve-se ter o cuidado de remover ou usar escapes em todos os caracteres que possam ter um significado especial para o interpretador de comandos. Por motivos de segurança, é melhor usar uma cadeia de caracteres de comando fixa ou, pelo menos, evitar passar qualquer entrada do usuário nela.
STDINEspecifica que a entrada vem da aplicação cliente.
STDOUTEspecifica que a saída vai para a aplicação cliente.
booleano
Especifica se a opção selecionada deve ser ativada ou desativada.
Pode ser escrito TRUE, ON, ou
1 para ativar a opção, e FALSE,
OFF, ou 0 para desativá-la.
O valor booleano
pode ser omitido, caso em que é assumido como sendo
TRUE.
FORMAT
Seleciona o formato dos dados a serem lidos ou escritos:
text, csv
(Valores Separados Por Vírgula), ou binary.
O padrão é text.
Veja Formatos de arquivo abaixo para obter
detalhes.
FREEZE
Solicita a cópia dos dados com as linhas já congeladas, exatamente
como seriam após executar o comando VACUUM FREEZE.
Se destina a ser uma opção de melhoria de desempenho para a carga
inicial dos dados.
As linhas serão congeladas apenas se a tabela que está sendo
carregada tiver sido criada ou truncada na subtransação corrente,
não houver cursores abertos, e não houver instantâneos mais
antigos mantidos por esta transação.
No momento, não é possível executar o comando
COPY FREEZE em uma tabela particionada ou
tabela estrangeira.
Esta opção só é permitida no comando COPY FROM.
Note que todas as outras sessões poderão ver imediatamente os dados, assim que forem carregados com sucesso. Isto viola as regras normais de visibilidade do Controle de concorrência, e os usuários devem estar cientes dos possíveis problemas que isto possa causar.
DELIMITER
Especifica o caractere que separa as colunas de cada linha
do arquivo.
O padrão é o caractere de tabulação no formato de texto,
e a vírgula no formato CSV.
Deve ser um caractere de um único byte.
Esta opção não é permitida ao usar o formato
binary.
NULL
Especifica a cadeia de caracteres que representa o valor nulo.
O padrão é \N (contrabarra-N) no formato texto,
e uma cadeia de caracteres vazia, não delimitada, no formato
CSV.
Pode-se preferir uma cadeia de caracteres vazia mesmo no formato
de texto, para os casos onde não se deseja distinguir nulos de
cadeias de caracteres vazias.
Esta opção não é permitida ao usar o formato
binary.
Ao usar COPY FROM, qualquer item de dados que
corresponda a esta cadeia de caracteres será armazenado como o
valor nulo, portanto, deve-se garantir que seja usada a mesma
cadeia de caracteres usada no comando COPY TO.
DEFAULT
Especifica a cadeia de caracteres que representa um valor padrão.
Cada vez que a cadeia de caracteres for encontrada no arquivo
de entrada, o valor padrão da coluna correspondente será utilizado.
Esta opção só é permitida em COPY FROM,
e somente quando não é usado o formato binary.
HEADER
Especifica que o arquivo contém uma linha de cabeçalho com os
nomes de cada coluna no arquivo.
Na saída, a primeira linha contém os nomes das colunas da tabela.
Na entrada, a primeira linha é descartada quando esta opção está
definida como true
(ou um valor booleano equivalente).
Se esta opção estiver definida como MATCH,
o número e os nomes das colunas na linha de cabeçalho devem
corresponder aos nomes reais das colunas da tabela, nesta ordem;
caso contrário, será gerado um erro.
Esta opção não é permitida ao usar o formato binary.
A opção MATCH só é válida para os comandos
COPY FROM.
QUOTE
Especifica o caractere delimitador a ser usado quando o valor
dos dados é delimitado.
O padrão é aspas (").
Deve ser um caractere de um único byte.
Esta opção só é permitida ao usar o formato CSV.
ESCAPE
Especifica o caractere que deve aparecer antes de um caractere de
dados que corresponda ao valor de QUOTE.
O valor padrão é o mesmo valor de QUOTE
(para que o caractere padrão de aspas seja duplicado se aparecer
nos dados).
Deve ser um caractere de um único byte.
Esta opção só é permitida ao usar o formato CSV.
FORCE_QUOTE
Força o uso de delimitadores para todos os valores não
NULL em cada coluna especificada.
A saída NULL nunca é delimitada.
Se for especificado *, os valores não-nulos
serão delimitados em todas as colunas.
Esta opção é permitida apenas no comando COPY TO,
e somente ao usar o formato CSV.
FORCE_NOT_NULL
Não corresponde os valores das colunas especificadas com a
cadeia de caracteres nula.
No caso padrão, onde a cadeia de caracteres nula está vazia,
isto significa que os valores vazios serão lidos como cadeias
de caracteres de comprimento zero em vez de nulos, mesmo quando
não estiverem delimitados.
Se for especificado *, esta opção será
aplicada a todas as colunas.
Esta opção é permitida apenas no comando COPY FROM,
e somente ao usar o formato CSV.
FORCE_NULL
Corresponde os valores das colunas especificadas com a cadeia
de caracteres nula, mesmo que tenha sido delimitada e,
se for encontrada uma correspondência, definido o valor como
NULL.
No caso padrão, em que a cadeia de caracteres nula está vazia,
isto converte uma cadeia de caracteres vazia delimitada em
NULL.
Se for especificado *, esta opção será
aplicada a todas as colunas.
Esta opção é permitida apenas no comando COPY FROM,
e somente ao usar o formato CSV.
ON_ERROR
Especifica como se comportar ao encontrar um erro ao converter
o valor de entrada de uma coluna em seu tipo de dados.
Uma ação_de_erro
igual a stop significa interromper o comando,
enquanto ignore significa descartar a linha
de entrada e continuar com a próxima.
O valor padrão é stop.
A opção ignore pode ser aplicada para
COPY FROM somente quando
FORMAT for text ou
csv.
Se ao menos uma linha for descartada, ao final do comando
COPY FROM será emitida uma mensagem
NOTICE contendo a contagem de linhas ignoradas.
Quando a opção LOG_VERBOSITY for definida como
verbose, será emitida uma mensagem
NOTICE contendo a linha do arquivo de entrada
e o nome da coluna cuja conversão de entrada falhou para cada
linha descartada.
Quando for definida como silent, não será
emitida nenhuma mensagem em relação às linhas ignoradas.
REJECT_LIMIT
Especifica o número máximo de erros tolerados durante a conversão
do valor de entrada de uma coluna para seu tipo de dados,
quando ON_ERROR estiver definido como
ignore.
Se a entrada causar mais erros do que o valor especificado, o
comando COPY irá falhar, mesmo que
ON_ERROR esteja definido como
ignore.
Esta cláusula deve ser usada com
ON_ERROR=ignore e
máximo_de_erros
deve ser um valor positivo do tipo de dados bigint.
Se este parâmetro não for especificado,
ON_ERROR=ignore
irá permitir um número ilimitado de erros, significando que o
COPY irá ignorar todos os dados com erros.
ENCODING
Especifica que o arquivo está codificado no
nome_da_codificação.
Se esta opção for omitida, será usada a codificação corrente
do cliente.
Veja Notas abaixo para obter mais
detalhes.
LOG_VERBOSITY
Especifica a quantidade de mensagens emitidas pelo comando
COPY: pode ser default,
verbose ou silent.
Se for especificado verbose, serão emitidas
mensagens adicionais durante o processamento.
silent suprime tanto as mensagens de
verbose quanto as de default.
Isto é usado atualmente no comando COPY FROM
quando a opção ON_ERROR está definida como
ignore.
WHERE
A cláusula opcional WHERE tem a forma geral
WHERE condição
onde condição é qualquer
expressão avaliada com um resultado do tipo boolean.
Qualquer linha que não satisfaça esta condição não será inserida
na tabela.
Uma linha satisfaz a condição se retornar verdade quando os valores
reais da linha forem substituídos por qualquer referência de variável.
No momento, não são permitidas subconsultas em expressões
WHERE, e a avaliação não vê nenhuma alteração
feita pelo próprio comando COPY
(isto é importante quando a expressão contém chamadas para funções
VOLATILE).
Após a conclusão bem-sucedida, o comando COPY
retorna uma etiqueta de comando no formato:
COPY contador
O contador é o número
de linhas copiadas.
O psql irá mostrar esta etiqueta do comando
somente se o comando não for COPY ... TO STDOUT,
ou o meta-comando equivalente do psql
\copy ... to stdout.
Isto é para evitar que se confunda a etiqueta do comando com os
dados exibidos.
O comando COPY TO pode ser usado apenas com
tabelas simples e visões materializadas preenchidas.
Por exemplo, o comando
COPY
copia as mesmas linhas que
tabela TOSELECT * FROM ONLY .
Entretanto, não oferece suporte direto a outros tipos de relações,
como tabelas particionadas, tabelas filhas de herança ou visões.
Para copiar todas as linhas dessas relações, deve ser usado
tabelaCOPY (SELECT * FROM
.
tabela) TO
O comando COPY FROM pode ser usado com tabelas
simples, estrangeiras ou particionadas, ou com visões que possuem
gatilhos INSTEAD OF INSERT.
É necessário possuir o privilégio de seleção na tabela cujos valores
serão lidos pelo comando COPY TO, e o privilégio
de inserção na tabela onde os valores serão inseridos pelo comando
COPY FROM.
É suficiente ter os privilégios de coluna na(s) coluna(s) listada(s)
no comando.
Se estiver ativa a segurança no nível de linha para a tabela,
as políticas relevantes para o comando SELECT
serão aplicadas ao comando
COPY .
No momento, não há suporte para o comando tabela TOCOPY FROM
para tabelas com segurança no nível de linha.
Em vez disso, devem ser usados comandos INSERT
equivalentes.
Os arquivos especificados no comando COPY são
lidos ou escritos diretamente pelo servidor, e não pela aplicação
cliente.
Portanto, os arquivos devem residir, ou serem acessíveis,
ao servidor de banco de dados, e não ao cliente.
Os arquivos devem ser acessíveis, e legíveis ou graváveis, pelo usuário
do PostgreSQL (o ID de usuário com o qual
o servidor é executado), e não pelo cliente.
Da mesma forma, o comando especificado por PROGRAM
é executado diretamente pelo servidor, e não pela aplicação cliente,
devendo ser executável pelo usuário do servidor
PostgreSQL.
O comando COPY especificando um arquivo ou um
comando só é permitido para os superusuários do banco de dados,
ou usuários que receberam uma das funções de banco de dados
(roles)
pg_read_server_files,
pg_write_server_files, ou
pg_execute_server_program, porque permite ler
ou escrever qualquer arquivo, ou executar um programa, que o
servidor tenha privilégios de acesso.
Não se deve confundir o comando COPY
com o meta-comando \copy
do psql.
O meta-comando \copy chama
COPY FROM STDIN ou
COPY TO STDOUT, e então busca/armazena os dados
em um arquivo acessível ao cliente psql.
Portanto, a acessibilidade do arquivo e os direitos de acesso
dependem do cliente e não do servidor, quando é usado
\copy.
Recomenda-se que o nome do arquivo usado no comando
COPY seja sempre especificado como um caminho
absoluto.
Isto é imposto pelo servidor no caso de COPY TO,
mas para COPY FROM tem-se a opção de ler de um
arquivo especificado por um caminho relativo.
O caminho será interpretado em relação ao diretório de trabalho
do processo do servidor (normalmente o diretório de dados da
instância), e não ao diretório de trabalho do cliente.
A execução de um comando por PROGRAM pode ser
restringida pelos mecanismos de controle de acesso do sistema
operacional, como o SELinux.
O comando COPY FROM dispara quaisquer gatilhos,
e verifica as restrições na tabela de destino.
No entanto, não chama as regras.
Para colunas de identidade, o comando COPY FROM
sempre escreve os valores da coluna fornecidos nos dados de entrada,
como a opção OVERRIDING SYSTEM VALUE do comando
INSERT .
A entrada e a saída do comando COPY são afetadas
pelo parâmetro DateStyle.
Para garantir a portabilidade para outras instalações do
PostgreSQL que podem usar configurações
não padrão do parâmetro DateStyle, o parâmetro
DateStyle deve ser definido como
ISO antes de executar o comando
COPY TO.
Também é uma boa ideia evitar escrever os dados com o parâmetro
IntervalStyle definido como
sql_standard, porque os valores de intervalo
negativo podem ser mal interpretados por um servidor que tenha uma
configuração diferente para IntervalStyle.
Os dados de entrada são interpretados segundo a opção
ENCODING, ou a codificação corrente do cliente,
e os dados de saída são codificados usando ENCODING,
ou a codificação corrente do cliente, mesmo que os dados não passem
pelo cliente, mas sejam lidos ou escritos em arquivo diretamente
pelo servidor.
O comando COPY FROM insere fisicamente as linhas
de entrada na tabela à medida que avança.
Se o comando falhar, estas linhas permanecerão no estado de excluída;
estas linhas não ficarão visíveis, mas ainda ocuparão espaço em disco.
Isto poderá representar um desperdício considerável de espaço em
disco se a falha ocorrer durante uma operação de cópia volumosa.
Deve ser usado o comando VACUUM para recuperar
o espaço desperdiçado.
FORCE_NULL e FORCE_NOT_NULL
podem ser usados simultaneamente na mesma coluna.
Isto resulta na conversão de cadeias de caracteres nulas delimitadas
em valores nulos, e cadeias de caracteres nulas não delimitadas em
cadeias de caracteres vazias.
Quando é usado o formato text, os dados lidos ou
escritos são de um arquivo de texto com uma linha para cada linha da
tabela.
As colunas em uma linha são separadas pelo caractere delimitador.
Os próprios valores das colunas são cadeias de caracteres geradas
pela função de saída, ou aceitáveis pela função de entrada,
do tipo de dados de cada campo.
A cadeia de caracteres nula especificada é usada no lugar das
colunas que são nulas.
O comando COPY FROM reporta um erro se qualquer
linha do arquivo de entrada contiver mais ou menos colunas do que
o esperado.
O fim dos dados pode ser representado por uma linha contendo apenas
uma contrabarra seguida de um ponto (\.).
Um marcador de fim de dados não é necessário ao ler de um arquivo,
já que o fim do arquivo serve perfeitamente bem; neste contexto,
esta disposição existe apenas para fins de retrocompatibilidade.
Entretanto, o psql
usa \. para terminar uma operação de
COPY FROM STDIN (ou seja, leitura de dados
em-linha do comando COPY em um script
SQL).
Neste contexto, a regra é necessária para que a operação possa ser
encerrada antes do final do script.
Devem ser usados caracteres de contrabarra (\)
nos dados do comando COPY, para preceder
caracteres de dados que, de outra forma, poderiam ser considerados
delimitadores de linha ou de coluna.
Em particular, os seguintes caracteres devem
ser precedidos por uma contrabarra se aparecerem como parte de um
valor de coluna: a própria contrabarra, nova linha, retorno de carro,
e o caractere delimitador corrente.
A cadeia de caracteres nula especificada é enviada pelo comando
COPY TO sem adicionar nenhuma contrabarra;
inversamente, COPY FROM compara a entrada com
a cadeia de caracteres nula antes de remover as contrabarras.
Portanto, uma cadeia de caracteres nula como \N
não pode ser confundida com o valor de dados real \N
(que seria representado como \\N).
As seguintes sequências especiais de contrabarra são reconhecidas
pelo comando COPY FROM:
| Sequência | Representa |
|---|---|
\b | Retrocesso (Backspace) (ASCII 8) |
\f | Alimentação de formulário (Form feed) (ASCII 12) |
\n | Nova linha (Newline) (ASCII 10) |
\r | Retorno de carro (Carriage return) (ASCII 13) |
\t | Tabulação (ASCII 9) |
\v | Tabulação vertical (ASCII 11) |
\dígitos | Contrabarra seguida de um a três dígitos octais especifica o byte com este código numérico |
\xdígitos | Contrabarra x seguido por um ou dois
dígitos hexadecimais especifica o byte com este código numérico |
No momento, o comando COPY TO não gera uma
sequência de contrabarra seguida de dígitos hexadecimais ou octais,
mas usa as outras sequências listadas acima para estes caracteres
de controle.
Qualquer outro caractere de contrabarra que não esteja mencionado
na tabela acima será usado para representar a si mesmo.
Entretanto, deve-se ter cuidado ao adicionar contrabarras
desnecessariamente, porque isto pode produzir acidentalmente uma
cadeia de caracteres correspondente ao marcador de fim de dados
(\.) ou à cadeia de caracteres nula
(\N por padrão).
Estas cadeias de caracteres são reconhecidas antes que qualquer
outro processamento de contrabarra seja feito.
É altamente recomendável que as aplicações que geram dados para o
comando COPY convertam os caracteres de
nova linha e retorno de carro presentes nos dados, para as sequências
\n e \r, respectivamente.
No momento, é possível representar um retorno de carro nos dados
por uma contrabarra seguida por retorno de carro, e representar uma
nova linha nos dados por uma contrabarra seguida por nova linha.
Entretanto, estas representações podem não ser aceitas em versões
futuras.
Estes dados também são altamente vulneráveis à corrupção se o arquivo
do comando COPY for transferido entre máquinas
diferentes (por exemplo, de
Unix para
Windows, ou vice-versa).
Todas as sequências de contrabarra são interpretadas após a conversão da codificação. Os bytes especificados com sequências de contrabarra de dígito octal e hexadecimal devem formar caracteres válidos na codificação do banco de dados.
O comando COPY TO termina cada linha com uma nova
linha no estilo Unix
(“\n”).
Em vez disso, os servidores executando no
Microsoft Windows geram
retorno de carro/nova linha (“\r\n”),
mas apenas para COPY para um arquivo do servidor;
para consistência entre plataformas, o comando
COPY TO STDOUT sempre gera
“\n”, independentemente da plataforma
do servidor.
O comando COPY FROM pode lidar com linhas que
terminam com nova linha, retorno de carro, ou retorno de
carro/nova linha.
Para reduzir o risco de erro devido à nova linha ou retorno de carro
sem contrabarra, que deveriam ser dados, o comando
COPY FROM relata se as terminações de linha na
entrada não forem todas iguais.
Esta opção de formato é usada para importar e exportar arquivos no
formato Valor Separado por Vírgula (CSV), usado
por muitos outros programas, como planilhas.
Em vez das regras de escape usadas pelo formato de texto puro do
PostgreSQL, esta opção produz e reconhece
o mecanismo de escape CSV comum.
Os valores em cada registro são separados pelo caractere
especificado por DELIMITER.
Se o valor contiver o caractere delimitador, o caractere
especificado por QUOTE, a cadeia de caracteres
NULL, o retorno de carro, ou o caractere de
alimentação de linha, então todo o valor será delimitado pelo
caractere definido por QUOTE, e qualquer
ocorrência de um caractere de QUOTE ou
ESCAPE dentro do valor é precedida pelo
caractere de escape.
Também pode ser usado FORCE_QUOTE para forçar
o uso de delimitadores ao exibir valores não NULL
em colunas específicas.
O formato CSV não possui uma maneira padrão de
distinguir um valor NULL de uma cadeia de
caracteres vazia.
O comando COPY do
PostgreSQL lida com isto por meio de
delimitação.
O NULL é gerado como a cadeia de caracteres do
parâmetro NULL, e não é delimitado, enquanto um
valor não NULL correspondendo à cadeia de
caracteres do parâmetro NULL é delimitado.
Por exemplo, com a configuração padrão, NULL
é escrito como uma cadeia de caracteres vazia sem aspas, enquanto
um valor de dados de cadeia de caracteres vazia é escrito com aspas
("").
A leitura de valores segue regras semelhantes.
Pode-se usar FORCE_NOT_NULL para evitar
comparações de entrada NULL para colunas específicas.
Também pode ser usado FORCE_NULL para converter
valores de dados de cadeia de caracteres nulos entre aspas em
NULL.
Como a contrabarra não é um caractere especial no formato
CSV, o marcador de fim de dados usado no modo
texto (\.) não é normalmente tratado como
especial ao ler dados CSV.
Uma exceção é que o psql irá terminar
uma operação COPY FROM STDIN (ou seja, leitura
de dados em-linha do comando COPY em um script
SQL) em uma linha contendo apenas
\., seja no modo texto ou
CSV.
As versões do PostgreSQL anteriores a
v18 sempre reconheceram \. não delimitado como
um marcador de fim de dados, mesmo ao ler de um arquivo separado.
Para manter a compatibilidade com as versões anteriores,
COPY TO sempre irá delimitar \.
quando estiver sozinho em uma linha, embora isto não seja mais
necessário.
No formato CSV todos os caracteres são importantes.
Um valor delimitado envolto por espaços em branco, ou quaisquer
caracteres diferentes do DELIMITER, inclui
estes caracteres.
Isto pode causar erros se forem importados dados de um sistema que
preenche linhas CSV com espaços em branco até
uma largura fixa.
Se esta situação ocorrer, pode ser necessário pré-processar o
arquivo CSV para remover os espaços em branco
à direita, antes de importar os dados para o
PostgreSQL.
O formato CSV reconhece e produz arquivos
CSV com valores delimitados contendo retornos
de carro e avanços de linha incorporados.
Portanto, os arquivos não possuem exatamente uma linha para cada
linha da tabela, como os arquivos no formato de texto.
Muitos programas produzem arquivos CSV estranhos
e, ocasionalmente, maldosos, portanto, o formato do arquivo é mais
uma convenção do que um padrão.
Assim, pode-se encontrar alguns arquivos que não podem ser
importados usando este mecanismo, e o comando COPY
pode produzir arquivos que outros programas não conseguem processar.
A opção de formato binário faz com que todos os
dados sejam armazenados/lidos com o formato binário em vez de texto.
É um pouco mais rápido do que os formatos de texto e
CSV, mas um arquivo no formato binário é menos
portável entre arquiteturas de máquina e versões do
PostgreSQL.
Além disso, o formato binário é muito específico para o tipo de dados;
por exemplo, não funciona para gerar dados binários de uma coluna
smallint e lê-los em uma coluna integer,
mesmo que isto funcione bem no formato de texto.
O formato de arquivo binário consiste em um
cabeçalho de arquivo, zero ou mais tuplas contendo os dados das
linhas, e um fechamento de arquivo.
Os cabeçalhos e dados estão na ordem de byte de rede
[116].
As versões do PostgreSQL anteriores à versão 7.4 usavam um formato de arquivo binário diferente.
O cabeçalho do arquivo consiste em 15 bytes de campos fixos, seguidos por uma área de extensão de cabeçalho de comprimento variável. Os campos fixos são:
A sequência de 11 bytes PGCOPY\n\377\r\n\0
— note-se que o byte zero é parte obrigatória da
assinatura.
(A assinatura é projetada para permitir a fácil identificação
de arquivos danificados por uma transferência não limpa de 8 bits.
Esta assinatura é alterada por filtros de tradução de fim de
linha, bytes zero descartados, bits altos descartados, ou
alterações de paridade.)
Máscara de bits inteiro de 32 bits para denotar aspectos importantes do formato do arquivo. Os bits são numerados a partir de 0 (LSB) a 31 (MSB). Note que este campo é armazenado na ordem de bytes da rede (byte mais significativo primeiro), assim como todos os campos inteiros usados no formato do arquivo. Os bits 16–31 são reservados para denotar problemas críticos de formato no arquivo; o leitor deve parar se encontrar um bit inesperado definido neste intervalo. Os bits 0–15 são reservados para sinalizar problemas de formato compatível com versões anteriores; o leitor deve simplesmente ignorar quaisquer bits inesperados definidos neste intervalo. No momento, apenas um bit sinalizador está definido, e o restante deve ser zero:
Se 1, estão incluídos OIDs nos dados; se 0, não. A coluna do sistema OID não tem mais suporte no PostgreSQL, mas o formato ainda contém o indicador.
Inteiro de 32 bits, comprimento em bytes do restante do cabeçalho, não incluindo ele mesmo. No momento, isto é zero, e a primeira tupla segue imediatamente. Mudanças futuras no formato podem permitir que dados adicionais estejam presentes no cabeçalho. O leitor deve ignorar silenciosamente quaisquer dados de extensão de cabeçalho com os quais não sabe o que fazer.
A área de extensão do cabeçalho foi concebida para conter uma sequência de blocos autoidentificados. O campo de sinalizadores não tem por objetivo informar aos leitores o que existe na área de extensão. O projeto específico do conteúdo da extensão do cabeçalho é deixado para uma versão posterior.
Este projeto permite adições de cabeçalho compatíveis com as versões anteriores (adicionar blocos de extensão de cabeçalho, ou definir bits de sinalizador de ordem inferior), e alterações não compatíveis com as versões anteriores (definir bits de sinalização de alta ordem para sinalizar estas alterações, e adicionar dados de suporte à área de extensão, se necessário).
Cada tupla começa com uma contagem inteira de 16 bits do número de
campos na tupla.
(No momento, todas as tuplas em uma tabela têm a mesma contagem,
mas isto pode não ser verdade para sempre.)
Em seguida, repetido para cada campo na tupla, há uma palavra de
comprimento de 32 bits seguida por este número de bytes de dados
do campo.
(A palavra de comprimento não inclui ela mesma, podendo ser zero.)
Como caso especial, o valor -1 indica o campo NULL.
Nenhum byte de valor segue no caso de NULL.
Não há preenchimento de alinhamento, ou qualquer outro dado extra entre os campos.
No momento, todos os valores de dados em um arquivo de formato binário são considerados em formato binário (código de formato um). Prevê-se que uma extensão futura possa adicionar um campo de cabeçalho, permitindo a especificação de códigos de formato por coluna.
Para determinar o formato binário apropriado para os dados reais da
tupla, deve ser consultado o código-fonte do
PostgreSQL, em particular as funções
*send e *recv para cada
tipo de dados da coluna (normalmente estas funções são encontradas
no diretório src/backend/utils/adt/ da
distribuição do código-fonte).
Se os OIDs estiverem incluídos no arquivo, o campo OID segue imediatamente a palavra de contagem de campo. É um campo normal, exceto que não está incluído na contagem de campos. Note que a coluna do sistema OID não tem suporte nas versões correntes do PostgreSQL.
O fechamento (trailer) do arquivo consiste em uma palavra inteira de 16 bits contendo -1. É facilmente distinguível da palavra de contagem de campos de uma tupla.
O leitor deve relatar um erro se uma palavra de contagem de campo não for -1, nem o número esperado de colunas. Isto fornece uma verificação extra contra alguma perda de sincronização com os dados.
O exemplo a seguir copia uma tabela para o cliente usando a barra
vertical (|) como delimitador de campo:
COPY country
TO STDOUT (DELIMITER '|');
Para copiar dados de um arquivo para a tabela country:
COPY country
FROM '/usr1/proj/bray/sql/country_data';
Para copiar para o arquivo apenas os países cujos nomes começam com 'A':
COPY (SELECT * FROM country WHERE country_name LIKE 'A%')
TO '/usr1/proj/bray/sql/a_list_countries.copy';
Para copiar em um arquivo comprimido, pode-se canalizar a saída por meio de um programa de compressão externo:
COPY country
TO PROGRAM 'gzip > /usr1/proj/bray/sql/country_data.gz';
Aqui está uma amostra de dados adequada para copiar de
STDIN para uma tabela:
AF AFGHANISTAN AL ALBANIA DZ ALGERIA ZM ZAMBIA ZW ZIMBABWE
Note que o espaço em branco em cada linha é, na verdade, o caractere de tabulação.
A seguir estão os mesmos dados, produzidos em formato binário.
Os dados são mostrados após a filtragem através do utilitário do
Unix od -c.
A tabela tem três colunas; a primeira tem o tipo char(2),
a segunda tem o tipo text, e a terceira tem o tipo
integer.
Todas as linhas têm um valor nulo na terceira coluna.
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
Não existe o comando COPY no padrão
SQL.
A seguinte sintaxe era usada antes do PostgreSQL versão 9.0, e ainda tem suporte:
COPYnome_da_tabela[ (nome_da_coluna[, ...] ) ] FROM { 'nome_do_arquivo' | STDIN } [ [ WITH ] [ BINARY ] [ DELIMITER [ AS ] 'caractere_delimitador' ] [ NULL [ AS ] 'cadeia_de_caracteres_nula' ] [ CSV [ HEADER ] [ QUOTE [ AS ] 'caractere_demarcador_de_campo' ] [ ESCAPE [ AS ] 'caractere_de_escape' ] [ FORCE NOT NULLnome_da_coluna[, ...] ] ] ] COPY {nome_da_tabela[ (nome_da_coluna[, ...] ) ] | (consulta) } TO { 'nome_do_arquivo' | STDOUT } [ [ WITH ] [ BINARY ] [ DELIMITER [ AS ] 'caractere_delimitador' ] [ NULL [ AS ] 'cadeia_de_caracteres_nula' ] [ CSV [ HEADER ] [ QUOTE [ AS ] 'caractere_demarcador_de_campo' ] [ ESCAPE [ AS ] 'caractere_de_escape' ] [ FORCE QUOTE {nome_da_coluna[, ...] | * } ] ] ]
Note que nesta sintaxe, BINARY e
CSV são tratados como palavras-chave independentes,
e não como argumentos da opção FORMAT.
A seguinte sintaxe era usada antes do PostgreSQL versão 7.3, e ainda tem suporte:
COPY [ BINARY ]nome_da_tabelaFROM { 'nome_do_arquivo' | STDIN } [ [USING] DELIMITERS 'caractere_delimitador' ] [ WITH NULL AS 'cadeia_de_caracteres_nula' ] COPY [ BINARY ]nome_da_tabelaTO { 'nome_do_arquivo' | STDOUT } [ [USING] DELIMITERS 'caractere_delimitador' ] [ WITH NULL AS 'cadeia_de_caracteres_nula' ]
[116] Para que máquinas com diferentes convenções de ordem de byte possam se comunicar, os protocolos da Internet especificam uma convenção canônica de ordem de byte para dados transmitidos pela rede. Isto é conhecido como ordem de byte de rede The GNU C Library – Byte Order Conversion (N. T.)