COPY

COPY — copia dados entre um arquivo e uma tabela

Sinopse

COPY nome_da_tabela [ ( nome_da_coluna [, ...] ) ]
    FROM { 'nome_do_arquivo' | PROGRAM 'comando' | STDIN }
    [ [ WITH ] ( opção [, ...] ) ]
    [ WHERE condição ]

COPY { nome_da_tabela [ ( nome_da_coluna [, ...] ) ] | ( consulta ) }
    TO { 'nome_do_arquivo' | PROGRAM 'comando' | STDOUT }
    [ [ WITH ] ( opção [, ...] ) ]

onde opção pode ser uma entre:

    FORMAT nome_do_formato
    FREEZE [ 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_ERROR ação_de_erro
    REJECT_LIMIT máximo_de_erros
    ENCODING 'nome_da_codificação'
    LOG_VERBOSITY verbosidade

Descrição

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.

Parâmetros

nome_da_tabela

O nome da tabela (opcionalmente qualificado pelo esquema).

nome_da_coluna

A 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_arquivo

O 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.

STDIN

Especifica que a entrada vem da aplicação cliente.

STDOUT

Especifica 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.

Nota

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).

Saídas

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.

Nota

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.

Notas

O comando COPY TO pode ser usado apenas com tabelas simples e visões materializadas preenchidas. Por exemplo, o comando COPY tabela TO copia as mesmas linhas que SELECT * FROM ONLY tabela. 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 COPY (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 tabela TO. No momento, não há suporte para o comando COPY 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.

Formatos de arquivo

Formato texto

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ênciaRepresenta
\bRetrocesso (Backspace) (ASCII 8)
\fAlimentação de formulário (Form feed) (ASCII 12)
\nNova linha (Newline) (ASCII 10)
\rRetorno de carro (Carriage return) (ASCII 13)
\tTabulação (ASCII 9)
\vTabulação vertical (ASCII 11)
\dígitosContrabarra seguida de um a três dígitos octais especifica o byte com este código numérico
\xdígitosContrabarra 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.

Formato CSV

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.

Nota

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.

Nota

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.

Nota

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.

Nota

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.

Formato binário

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].

Nota

As versões do PostgreSQL anteriores à versão 7.4 usavam um formato de arquivo binário diferente.

Cabeçalho do arquivo

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:

Assinatura

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.)

Campos sinalizadores

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:

Bit 16

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.

Comprimento da área de extensão do cabeçalho

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).

Tuplas

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.

Fechamento do arquivo

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.

Exemplos

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

Conformidade

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:

COPY nome_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 NULL nome_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_tabela
    FROM { 'nome_do_arquivo' | STDIN }
    [ [USING] DELIMITERS 'caractere_delimitador' ]
    [ WITH NULL AS 'cadeia_de_caracteres_nula' ]

COPY [ BINARY ] nome_da_tabela
    TO { 'nome_do_arquivo' | STDOUT }
    [ [USING] DELIMITERS 'caractere_delimitador' ]
    [ WITH NULL AS 'cadeia_de_caracteres_nula' ]

Veja também

Relatório de progresso do COPY


[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.)