↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 6.4 已于 2003 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

COPY

COPY — 在文件和表之间复制数据

大纲

COPY [ BINARY ] table [ WITH OIDS ]
    FROM { 'filename' | stdin }
    [ USING DELIMITERS 'delimiter' ]
COPY [ BINARY ] table [ WITH OIDS ]
    TO { 'filename' | stdout }
    [ USING DELIMITERS 'delimiter' ]
  

输入

BINARY

更改字段格式化的行为,强制所有数据以二进制对象而不是文本格式存储或读取。

table

一个现有表的名称。

WITH OIDS

为每一行复制内部唯一对象 id(OID)。

filename

输入或输出文件的绝对 Unix 路径名。

stdin

指定输入来自管道或终端。

stdout

指定输出到管道或终端。

delimiter

分隔输入或输出字段的字符。

输出

→ COPY

复制成功完成。

→ ERROR: error message

复制因错误消息中所述的原因而失败。

描述

COPY 在 Postgres 表和标准 Unix 文件之间移动数据。

COPY 指示 Postgres 后端直接读取或写入文件。该文件必须对后端直接可见,且名称必须从后端的角度指定。 如果指定了 stdin 或 stdout,数据通过客户端前端流经后端。

注解

BINARY 关键字强制所有数据以二进制对象而不是文本格式存储/读取。它比普通的复制命令略快,但通常不可移植,且生成的文件略大,尽管这一因素高度依赖于数据本身。默认情况下,文本复制使用制表符("\t")作为分隔符。也可以用关键字短语 USING DELIMITERS 把分隔符改为任何其他单个字符。数据字段中恰好匹配分隔符的字符将被引用。

你必须对其值被 COPY 读取的任何表拥有 select 访问权限,并对正被 COPY 插入值的表拥有 insert 或 update 访问权限。对于被 COPY 读取或写入的任何文件,后端还需要适当的 Unix 权限。

关键字短语 USING DELIMITERS 指定一个用于列之间所有分隔符的单个字符。如果在分隔符字符串中指定了多个字符,只使用第一个字符。

提示

不要把 COPY 与 psql 指令 \copy 混淆。

文件格式

文本格式

当 COPY TO 不带 BINARY 选项使用时,生成的文件中每一行(实例)占一行,各列(属性)由分隔字符分隔。嵌入的分隔字符前面会有一个反斜线字符("\")。属性值本身是由与各属性类型关联的输出函数生成的字符串。类型的输出函数不应尝试生成反斜线字符;这将由 COPY 自身处理。

每个实例的实际格式为

<attr1><separator><attr2><separator>...<separator><attrn><newline>
    

如果指定了 WITH OIDS,oid 放在行的开头。

如果 COPY 把输出发送到标准输出而不是文件,完成时它将在单独一行上发送一个反斜线("\")和一个句点(".")后紧跟一个换行符。类似地,如果 COPY 从标准输入读取,它将期待一个反斜线("\")和一个句点(".")后跟一个换行符,作为一行上表示文件结束的前三个字符。不过,如果在找到这个特殊的文件结束模式之前遇到真正的 EOF,COPY 将终止(随后后端自身也终止)。

反斜线字符还有其他特殊含义。NULL 属性输出为 “\N”。字面反斜线字符输出为两个连续的反斜线("\\")。字面制表符表示为一个反斜线加一个制表符。字面换行符表示为一个反斜线加一个换行符。在加载不是由 Postgres 生成的文本数据时,你需要把反斜线字符("\")转换为双反斜线("\\")以确保正确加载。

二进制格式

在 COPY BINARY 的情况下,文件的前四个字节是文件中的实例数。如果此数为零,COPY BINARY 命令将读取直到遇到文件结尾。否则,读满这个数目的实例后将停止读取。文件中的其余数据将被忽略。

文件中每个实例的格式如下。注意必须严格遵循此格式。下表中无符号四字节整数称为 uint32。

表 19.1. 二进制复制文件的内容

在文件的开头
uint32 元组的数目
对于每个元组
uint32 元组数据的总长度
uint32 oid(如果指定)
uint32 空属性的数目
[uint32,...,uint32] 属性编号(从 0 计数)
- <tuple data>

二进制数据的对齐

在 Sun-3 上,2 字节属性按两字节边界对齐,所有更大的属性按四字节边界对齐。字符属性按单字节边界对齐。在大多数其他机器上,所有大于 1 字节的属性都按四字节边界对齐。注意变长属性前面有该属性的长度;数组只是数组元素类型的连续流。

用法

下面的例子把一个表复制到标准输出,使用竖线("|")作为字段分隔符:

COPY country TO stdout USING DELIMITERS '|';
  

把数据从一个 Unix 文件复制到表 "country":

COPY country FROM '/usr1/proj/bray/sql/country_data';
  

下面是一段适合从 stdin 复制到表中的数据示例(所以最后一行有终止序列):

   AF      AFGHANISTAN
   AL      ALBANIA
   DZ      ALGERIA
   ...
   ZM      ZAMBIA
   ZW      ZIMBABWE
   \.
  

相同的数据在一台 Linux/i586 机器上以二进制格式输出。 数据经过 Unix 工具 od -c 过滤后显示。该表有 三个字段;第一个是 char(2), 第二个是 text。所有行的第三个字段都是空值。 注意 char(2) 字段如何用空字节填充到四字节,text 字段前面有它的长度:

   355  \0  \0  \0 027  \0  \0  \0 001  \0  \0  \0 002  \0  \0  \0
   006  \0  \0  \0   A   F  \0  \0 017  \0  \0  \0   A   F   G   H
     A   N   I   S   T   A   N 023  \0  \0  \0 001  \0  \0  \0 002
    \0  \0  \0 006  \0  \0  \0   A   L  \0  \0  \v  \0  \0  \0   A
     L   B   A   N   I   A 023  \0  \0  \0 001  \0  \0  \0 002  \0
    \0  \0 006  \0  \0  \0   D   Z  \0  \0  \v  \0  \0  \0   A   L
     G   E   R   I   A
   ...              \n  \0  \0  \0   Z   A   M   B   I   A 024  \0
    \0  \0 001  \0  \0  \0 002  \0  \0  \0 006  \0  \0  \0   Z   W
    \0  \0  \f  \0  \0  \0   Z   I   M   B   A   B   W   E
  

缺陷

COPY 在第一个错误处停止操作。这对 COPY FROM 不会导致问题,但在 COPY TO 中目标关系当然会被部分修改。失败的复制之后应当用 VACUUM 查询清理。

由于 Postgres 后端的当前工作目录 通常与用户的工作目录不同,复制到文件 "foo"(不带附加路径信息)可能给天真的用户带来意外的结果。在这种情况下,foo 最终会出现在 $PGDATA/foo 中。一般而言,指定要复制的文件时应使用后端服务器机器上所见的完整路径名。

用作 COPY 参数的文件必须位于数据库服务器机器上或可由其访问,方法是在本地磁盘上或网络文件系统上。

当使用从一台机器到另一台机器的 TCP/IP 连接并指定了目标文件时,目标文件将写入后端运行的机器而不是用户的机器。

兼容性

SQL92

在 SQL92 中没有 COPY 语句。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。