PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

COPY

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

Synopsis

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]
    [ WHERE condition ]

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | PROGRAM 'command' | STDOUT }
    [ [ WITH ] ( option [, ...] ) ]

where option can be one of:

    FORMAT format_name
    FREEZE [ boolean ]
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    DEFAULT 'default_string'
    HEADER [ boolean | MATCH ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column_name [, ...] ) | * }
    FORCE_NOT_NULL { ( column_name [, ...] ) | * }
    FORCE_NULL { ( column_name [, ...] ) | * }
    ON_ERROR error_action
    REJECT_LIMIT maxerror
    ENCODING 'encoding_name'
    LOG_VERBOSITY verbosity

描述

COPY 在 PostgreSQL 表和标准文件系统文件之间移动数据。COPY TO 把一个表的内容复制到一个文件,而 COPY FROM 把数据从一个文件复制到一个表中(将数据追加到表中已有的内容上)。COPY TO 也可以复制一个 SELECT 查询的结果。

如果指定了列的列表,COPY TO 将只把指定列中的数据复制到文件。对于 COPY FROM,文件中的每一个字段会按顺序插入到指定的列中。在 COPY FROM 列列表中未指定的表列将接收它们的默认值。

带文件名的 COPY 指示 PostgreSQL 服务器直接从一个文件读取或向其写入。该文件必须能被 PostgreSQL 用户(服务器运行所用的用户 ID)访问,并且文件名必须从服务器的角度指定。当指定了 PROGRAM 时,服务器会执行给定的命令,并从该程序的标准输出读取,或者向该程序的标准输入写入。命令必须从服务器的角度指定,并且能被 PostgreSQL 用户执行。当指定了 STDIN 或 STDOUT 时,数据会通过客户端与服务器之间的连接传输。

每个运行 COPY 的后端都会在 pg_stat_progress_copy 视图中报告其进度。详见 Section 27.4.3。

默认情况下,如果 COPY 在处理过程中遇到错误就会失败。对于希望尽力加载整个文件的用例,可以使用 ON_ERROR 子句来指定其他行为。

参数

table_name

一个现有表的名称(可以选择用模式限定)。

column_name

一个可选的、要复制的列的列表。如果没有指定列列表,则将复制表中除生成列之外的所有列。

query

一个其结果将被复制的 SELECT、VALUES、INSERT、UPDATE、DELETE 或 MERGE 命令。注意查询必须用圆括号包围。

对于 INSERT、UPDATE、DELETE 和 MERGE 查询,必须提供 RETURNING 子句,并且目标关系不能有条件规则,不能有 ALSO 规则,也不能有展开为多条语句的 INSTEAD 规则。

filename

输入或输出文件的路径名。输入文件名可以是绝对路径或相对路径,但输出文件名必须是绝对路径。Windows 用户可能需要使用 E'' 字符串,并将路径名中使用的所有反斜线加倍。

PROGRAM

要执行的命令。在 COPY FROM 中,输入从该命令的标准输出读取;在 COPY TO 中,输出被写入该命令的标准输入。

注意该命令是由 shell 调用的,因此如果你需要传递任何来自不可信来源的参数,必须小心地移除或转义任何对 shell 可能有特殊含义的特殊字符。出于安全考虑,最好使用固定的命令字符串,或者至少避免在其中包含任何用户输入。

STDIN

指定输入来自客户端应用。

STDOUT

指定输出发送到客户端应用。

boolean

指定所选选项应被打开还是关闭。可以写 TRUE、ON 或 1 来启用该选项,写 FALSE、OFF 或 0 来禁用它。boolean 值也可以省略,此时假定其为 TRUE。

FORMAT

选择要读取或写入的数据格式:text、csv(逗号分隔值)或 binary。默认为 text。详情请参见下文的 File Formats。

FREEZE

请求在复制数据时让行处于冻结状态,就像运行过 VACUUM FREEZE 命令之后那样。这是为初始数据加载设计的一个性能选项。只有当被加载的表是在当前子事务中创建或截断的、没有打开的游标、并且本事务没有持有更老的快照时,行才会被冻结。目前无法对分区表或外部表执行 COPY FREEZE。该选项只允许在 COPY FROM 中使用。

注意一旦数据被成功加载,所有其他会话将立即能够看到这些数据。这违反了 MVCC 可见性的常规规则,用户应该意识到这可能导致的问题。

DELIMITER

指定在文件每一行内分隔各列的字符。在文本格式中默认为制表符,在 CSV 格式中默认为逗号。它必须是单个单字节字符。使用 binary 格式时不允许使用该选项。

NULL

指定表示空值的字符串。在文本格式中默认为 \N(反斜线-N),在 CSV 格式中默认为未加引号的空字符串。如果在某些情况下你不想区分空值和空字符串,那么即使在文本格式中也可以使用空字符串。使用 binary 格式时不允许使用该选项。

Note

使用 COPY FROM 时,任何匹配该字符串的数据项都会被存储为空值,因此你应该确保使用与 COPY TO 时相同的字符串。

DEFAULT

指定表示默认值的字符串。每当在输入文件中找到该字符串时,就会使用相应列的默认值。该选项只允许在 COPY FROM 中使用,并且在使用 binary 格式时不允许使用。

HEADER

指定文件包含一个带有文件中各列名称的表头行。在输出时,第一行包含来自表的列名。在输入时,当该选项被设置为 true(或等效的布尔值)时,第一行会被丢弃。如果该选项被设置为 MATCH,表头行中列的数量和名称必须按顺序与表的实际列名匹配,否则会抛出错误。使用 binary 格式时不允许使用该选项。MATCH 选项只对 COPY FROM 命令有效。

QUOTE

指定在数据值被加引号时使用的引用字符。默认为双引号。它必须是单个单字节字符。该选项只允许在 CSV 格式中使用。

ESCAPE

指定出现在与 QUOTE 值匹配的数据字符之前的字符。默认与 QUOTE 值相同(这样当引用字符出现在数据中时就会被加倍)。它必须是单个单字节字符。该选项只允许在 CSV 格式中使用。

FORCE_QUOTE

强制对每个指定列中的所有非 NULL 值使用引用。NULL 输出永远不会被加引号。如果指定了 *,则所有列中的非 NULL 值都会被加引号。该选项只允许在 COPY TO 中使用,并且只允许在 CSV 格式中使用。

FORCE_NOT_NULL

不将指定列的值与 NULL 字符串进行匹配。在 NULL 字符串为空的默认情况下,这意味着空的值将被读取为零长度字符串而不是 NULL,即使它们没有被加引号。如果指定了 *,该选项将应用于所有列。该选项只允许在 COPY FROM 中使用,并且只允许在 CSV 格式中使用。

FORCE_NULL

将指定列的值与 NULL 字符串进行匹配,即使它已被加引号,并且如果找到匹配就把该值设置为 NULL。在 NULL 字符串为空的默认情况下,这会把加了引号的空字符串转换为 NULL。如果指定了 *,该选项将应用于所有列。该选项只允许在 COPY FROM 中使用,并且只允许在 CSV 格式中使用。

ON_ERROR

指定在将列的输入值转换为其数据类型遇到错误时的行为。error_action 值为 stop 表示使命令失败,而 ignore 表示丢弃该输入行并继续处理下一行。默认值为 stop。

ignore 选项只适用于 COPY FROM,且仅当 FORMAT 为 text 或 csv 时。

如果至少有一行被丢弃,一条包含被忽略行数的 NOTICE 消息会在 COPY FROM 结束时发出。当 LOG_VERBOSITY 选项被设置为 verbose 时,对每个被丢弃的行都会发出一条 NOTICE 消息,其中包含输入文件中的该行内容以及输入转换失败的列名。当它被设置为 silent 时,不会发出任何与被忽略行有关的消息。

REJECT_LIMIT

指定当 ON_ERROR 被设置为 ignore 时,在将列的输入值转换为其数据类型过程中容忍的最大错误数量。如果输入造成的错误超过指定值,COPY 命令也会失败,即使 ON_ERROR 被设置为 ignore。该子句必须与 ON_ERROR=ignore 一起使用,并且 maxerror 必须是正的 bigint。如果未指定,ON_ERROR=ignore 允许无限数量的错误,这意味着 COPY 将跳过所有错误数据。

ENCODING

指定文件以 encoding_name 编码。如果省略该选项,则使用当前的客户端编码。更多细节请参见下文的注记。

LOG_VERBOSITY

指定 COPY 命令发出的消息量:default、verbose 或 silent。如果指定了 verbose,则在处理期间会发出额外的消息。silent 会同时抑制详细消息和默认消息。

目前它用在 COPY FROM 命令中,此时 ON_ERROR 选项被设置为 ignore。

WHERE

可选的 WHERE 子句具有如下一般形式

WHERE condition

其中 condition 是任何能计算出 boolean 类型结果的表达式。任何不满足该条件的行都不会被插入到表中。当把实际的行值替换到任何变量引用中后返回真时,该行就满足条件。

目前,WHERE 表达式中不允许使用子查询和生成列,并且求值时不会看到 COPY 本身所做的任何更改(当表达式包含对 VOLATILE 函数的调用时,这一点很重要)。

输出

成功完成时,COPY 命令会返回如下形式的命令标签

COPY count

其中 count 是被复制的行数。

Note

psql 只有当命令不是 COPY ... TO STDOUT 或等效的 psql 元命令 \copy ... to stdout 时,才会打印这个命令标签。这是为了防止将命令标签与刚刚打印的数据混淆。

注记

COPY TO 可以用于普通表和已填充数据的物化视图。例如,COPY table TO 会复制与 SELECT * FROM ONLY table 相同的行。但是它不直接支持其他关系类型,例如分区表、继承子表或视图。要从这类关系中复制所有行,请使用 COPY (SELECT * FROM table) TO。

COPY FROM 可以用于普通表、外部表或分区表,也可以用于带有 INSTEAD OF INSERT 触发器的视图。

你必须对被 COPY TO 读取其值的表拥有选择权限,并且对被 COPY FROM 向其插入值的表拥有插入权限。只要拥有命令中列出的列上的列权限就足够了。

如果为表启用了行级安全性,相关的 SELECT 策略将应用于 COPY table TO 语句。目前,对于启用了行级安全性的表,不支持 COPY FROM。请改用等效的 INSERT 语句。

COPY 命令中命名的文件由服务器直接读取或写入,而不是由客户端应用读取或写入。因此,它们必须位于数据库服务器机器上或能被其访问,而不是客户端。它们必须能被 PostgreSQL 用户(服务器运行所用的用户 ID)访问、读取或写入,而不是客户端。类似地,用 PROGRAM 指定的命令由服务器直接执行,而不是由客户端应用执行,并且必须能被 PostgreSQL 用户执行。COPY 指定文件或命令的做法只允许数据库超级用户或被授予 pg_read_server_files、pg_write_server_files 或 pg_execute_server_program 角色之一的用户使用,因为它允许读取或写入服务器有权访问的任何文件或运行程序。

不要把 COPY 与 psql 的指令 \copy 混淆。\copy 会调用 COPY FROM STDIN 或 COPY TO STDOUT,然后在 psql 客户端可访问的一个文件中获取/存储数据。因此,当使用 \copy 时,文件的可访问性和访问权限取决于客户端而不是服务器。

建议将 COPY 中使用的文件名始终指定为绝对路径。在 COPY TO 的情况下,服务器会强制这一点,但对于 COPY FROM,你确实可以选择从用相对路径指定的文件读取。路径将相对于服务器进程的工作目录(通常是集簇的数据目录)来解释,而不是客户端的工作目录。

使用 PROGRAM 执行命令可能会受到操作系统访问控制机制(如 SELinux)的限制。

COPY FROM 会调用目标表上的所有触发器和检查约束。但是,它不会调用规则。

对于标识列,COPY FROM 命令将始终写入输入数据中提供的列值,就像 INSERT 选项 OVERRIDING SYSTEM VALUE 一样。

COPY 的输入和输出会受到 DateStyle 的影响。为了确保能移植到其他 PostgreSQL 安装(它们可能使用非默认的 DateStyle 设置),DateStyle 应被设置为 ISO,然后再使用 COPY TO。另外,最好避免在 IntervalStyle 设置为 sql_standard 的情况下转储数据,因为负的间隔值可能会被具有不同 IntervalStyle 设置的服务器误解。

输入数据会根据 ENCODING 选项或当前客户端编码来解释,输出数据会以 ENCODING 或当前客户端编码进行编码,即使数据不经过客户端而是由服务器直接从文件读取或向文件写入。

COPY FROM 命令在执行过程中会物理地将输入行插入到表中。如果命令失败,这些行会处于已删除状态;这些行将不可见,但仍会占用磁盘空间。如果失败发生在一个大型复制操作的后期,这可能意味着相当可观的磁盘空间被浪费。应当使用 VACUUM 来回收被浪费的空间。

FORCE_NULL 和 FORCE_NOT_NULL 可以同时在同一个列上使用。这会把加了引号的 NULL 字符串转换为空值,把未加引号的 NULL 字符串转换为空字符串。

文件格式

文本格式

当使用 text 格式时,读取或写入的数据是一个文本文件,每个表行占一行。行中的各列由分隔符字符分隔。列值本身是由各属性数据类型的输出函数生成的、或能被其输入函数接受的字符串。指定的 NULL 字符串被用来代替为空的列。如果输入文件的任何一行包含的列比预期的多或少,COPY FROM 将抛出一个错误。

数据的结束可以用一个只包含反斜线-句点(\.)的行来表示。从文件读取时不需要数据结束标记,因为文件结束本身就完全够用了;在这种上下文中,这一规定只是为了向后兼容而存在。不过,psql 使用 \. 来终止 COPY FROM STDIN 操作(即在 SQL 脚本中读取内联的 COPY 数据)。在这种上下文中,需要这条规则才能在脚本结束之前结束该操作。

反斜线字符(\)可以在 COPY 数据中使用,用来引用那些否则可能被当作行或列分隔符的数据字符。特别是,如果以下字符作为列值的一部分出现,则它们前面必须加一个反斜线:反斜线本身、换行符、回车符以及当前的分隔符字符。

指定的 NULL 字符串由 COPY TO 发送时不添加任何反斜线;相反,COPY FROM 会在移除反斜线之前将输入与 NULL 字符串进行匹配。因此,诸如 \N 这样的 NULL 字符串不会与实际数据值 \N(它将被表示为 \\N)相混淆。

COPY FROM 可以识别以下特殊的反斜杠序列:

序列表示
\b退格(ASCII 8)
\f换页(ASCII 12)
\n换行(ASCII 10)
\r回车(ASCII 13)
\t制表符(ASCII 9)
\v垂直制表符(ASCII 11)
\digits反斜杠后跟一至三个八进制数字,表示具有该数值的字节
\xdigits反斜杠 x 后跟一或两个十六进制数字,表示具有该数值的字节

目前,COPY TO 不会输出八进制或十六进制数字形式的反斜杠序列,但对上述控制字符会使用列出的其他序列。

上表中未提到的任何其他反斜线字符都将被视为其本身。但是,要当心不要不必要地添加反斜线,因为这可能会意外地产生与数据结束标记(\.)或 NULL 字符串(默认为 \N)匹配的字符串。这些字符串会在进行任何其他反斜线处理之前被识别。

强烈建议生成 COPY 数据的应用将数据中的换行符和回车符分别转换为 \n 和 \r 序列。目前可以用一个反斜线加回车符来表示数据回车,用一个反斜线加换行符来表示数据换行。但是,这些表示方式在未来的版本中可能不再被接受。而且,如果 COPY 文件在不同机器之间传输(例如从 Unix 到 Windows 或反过来),它们也非常容易被损坏。

所有反斜线序列都在编码转换之后被解释。用八进制和十六进制数字反斜线序列指定的字节必须在数据库编码中构成有效字符。

COPY TO 会用一个 Unix 风格的换行符(“\n”)来终止每一行。运行在 Microsoft Windows 上的服务器会改为输出回车符/换行符(“\r\n”),但只对 COPY 复制到服务器文件的情况如此;为了跨平台的一致性,COPY TO STDOUT 不管服务器平台是什么都总是发送 “\n”。COPY FROM 可以处理以换行符、回车符或回车符/换行符结尾的行。为了降低由于本应作为数据的、未加反斜线的换行符或回车符导致出错的风险,如果输入中的行结束符不完全一致,COPY FROM 会报错。

CSV 格式

该格式选项用于导入和导出许多其他程序(如电子表格)所使用的逗号分隔值(CSV)文件格式。它并不使用 PostgreSQL 标准文本格式所使用的转义规则,而是产生和识别常见的 CSV 转义机制。

每个记录中的值由 DELIMITER 字符分隔。如果值中包含分隔符字符、QUOTE 字符、NULL 字符串、回车符或换行符,那么整个值的前面和后面都会加上 QUOTE 字符,并且值中出现的任何 QUOTE 字符或 ESCAPE 字符前面都会加上转义字符。你还可以使用 FORCE_QUOTE 在输出特定列中的非 NULL 值时强制加引号。

CSV 格式没有标准的方法来区分 NULL 值和空字符串。PostgreSQL 的 COPY 通过加引号来处理这个问题。NULL 被输出为 NULL 参数字符串且不加引号,而匹配 NULL 参数字符串的非 NULL 值则会被加引号。例如,在使用默认设置时,NULL 会被写成一个不加引号的空字符串,而空字符串数据值会被写成带双引号的形式("")。读取值时遵循类似的规则。你可以使用 FORCE_NOT_NULL 来防止对特定列进行 NULL 输入比较。你还可以使用 FORCE_NULL 把加了引号的 NULL 字符串数据值转换为 NULL。

由于反斜线在 CSV 格式中不是特殊字符,文本模式中使用的数据结束标记(\.)在读取 CSV 数据时通常不会被当作特殊处理。一个例外是,psql 会终止 COPY FROM STDIN 操作(即在 SQL 脚本中读取内联的 COPY 数据),只要遇到只包含 \. 的行,无论它是文本还是 CSV 模式。

Note

v18 之前的 PostgreSQL 版本总是把不加引号的 \. 识别为数据结束标记,即使是从单独的文件读取时也是如此。为了与旧版本兼容,COPY TO 会在 \. 单独出现在一行时给它加引号,尽管这已不再必要。

Note

在 CSV 格式中,所有字符都是有意义的。一个被空白或 DELIMITER 之外的任何字符包围的加引号值将包含这些字符。如果你从一个用空白把 CSV 行填充到某个固定宽度的系统导入数据,这可能会导致错误。如果出现这种情况,你可能需要对 CSV 文件进行预处理以移除尾部的空白,然后再把数据导入 PostgreSQL。

Note

CSV 格式既能识别也能产生其加引号值中包含内嵌回车符和换行符的 CSV 文件。因此,这种文件不像文本格式的文件那样严格地每个表行占一行。

Note

许多程序会产生奇怪的、有时甚至是离谱的 CSV 文件,所以这种文件格式与其说是标准,不如说是一种惯例。因此,你可能会遇到一些无法用该机制导入的文件,而 COPY 也可能产生其他程序无法处理的文件。

二进制格式

binary 格式选项使所有数据都以二进制格式而不是文本格式存储/读取。它比文本和 CSV 格式要快一些,但二进制格式的文件在不同机器体系结构和 PostgreSQL 版本之间的可移植性较差。此外,二进制格式对数据类型非常敏感;例如,从一个 smallint 列输出二进制数据再读入一个 integer 列是行不通的,尽管在文本格式下这样做完全没问题。

binary 文件格式由一个文件头、零个或多个包含行数据的元组以及一个文件尾组成。头部和数据都采用网络字节序。

Note

7.4 之前的 PostgreSQL 版本使用的是一种不同的二进制文件格式。

文件头

文件头部由 15 个字节的固定字段组成,其后是一个变长的头部扩展区。固定字段为:

签名

11 字节序列 PGCOPY\n\377\r\n\0 — 注意零字节是签名的必要组成部分。(设计该签名是为了便于识别被非 8 位干净的传输所破坏的文件。行尾转换过滤器、被丢弃的零字节、被丢弃的高位或奇偶校验改变都会改变该签名。)

标志位字段

32 位整数位掩码,用于标记文件格式的重要方面。位从 0(LSB)到 31(MSB)编号。注意该字段以网络字节序(最高有效字节在前)存储,文件格式中使用的所有整数字段也是如此。位 16–31 保留用于表示严重的文件格式问题;如果读取器在该范围内发现意外的置位,应当中止。位 0–15 保留用于表示向后兼容的格式问题;读取器应当简单地忽略该范围内任何意外的置位。当前只定义了一个标志位,其余必须为零:

位 16

如果为 1,则数据中包含 OID;如果为 0,则不包含。PostgreSQL 已不再支持 OID 系统列,但该格式仍包含这个指示字段。

头部扩展区长度

32 位整数,表示头部剩余部分的字节长度,不包括自身。当前该值为零,第一个元组紧随其后。未来对该格式的更改可能允许在头部包含额外的数据。读取器应当静默跳过它不知道如何处理的任何头部扩展数据。

头部扩展区域的设想是包含一系列自标识的数据块。标志字段的目的并不是告诉读取器扩展区域中有什么。头部扩展内容的具体设计留待以后的版本完成。

这种设计既允许向后兼容的头部增添(增加头部扩展数据块,或设置低位标志位),也允许非向后兼容的更改(设置高位标志位以指示此类更改,并在需要时向扩展区域添加支持数据)。

元组

每个元组以一个 16 位整数开头,表示该元组中字段的数量。(目前,一个表中的所有元组都具有相同的数量,但情况并不总是如此。)然后,对元组中的每个字段重复:有一个 32 位的长度字,后面跟着相应字节数的字段数据。(长度字不包括它自身,并且可以为零。)作为一种特殊情况,-1 表示 NULL 字段值。在 NULL 的情况下,后面没有值字节。

字段之间没有对齐填充或任何其他额外的数据。

目前,二进制格式文件中的所有数据值都被假定为二进制格式(格式代码 1)。预计未来的扩展可能会增加一个头部字段,允许指定每个列的格式代码。

要为实际的元组数据确定合适的二进制格式,你应该查阅 PostgreSQL 源代码,特别是每个列的数据类型的 *send 和 *recv 函数(这些函数通常位于源码发行版的 src/backend/utils/adt/ 目录中)。

如果文件中包含 OID,OID 字段会紧跟在字段计数字之后。它是一个普通字段,只是不计入字段计数。注意,当前的 PostgreSQL 版本不再支持 oid 系统列。

文件尾

文件尾由一个包含 -1 的 16 位整数字组成。这很容易与元组的字段计数字区分开。

如果字段计数字既不是 -1 也不是预期的列数,读取器应当报告一个错误。这提供了一种额外的检查,防止以某种方式与数据失去同步。

示例

下面的例子使用竖线(|)作为字段分隔符把一个表复制到客户端:

COPY country TO STDOUT (DELIMITER '|');

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

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

只把名称以 'A' 开头的国家复制到一个文件中:

COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_countries.copy';

要复制到一个压缩文件,你可以把输出通过一个外部压缩程序进行管道传输:

COPY country TO PROGRAM 'gzip > /usr1/proj/bray/sql/country_data.gz';

下面是一段适合从 STDIN 复制到一个表中的数据示例:

AF      AFGHANISTAN
AL      ALBANIA
DZ      ALGERIA
ZM      ZAMBIA
ZW      ZIMBABWE

注意每一行上的空白实际上是一个制表符。

以下是相同的数据,以二进制格式输出。数据是经过 Unix 工具 od -c 过滤后显示的。该表有三列;第一列的类型为 char(2),第二列的类型为 text,第三列的类型为 integer。所有行在第三列都有一个空值。

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

兼容性

SQL 标准中没有 COPY 语句。

以下语法在 PostgreSQL 9.0 版之前使用,目前仍受支持:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ]
          [ BINARY ]
          [ DELIMITER [ AS ] 'delimiter_character' ]
          [ NULL [ AS ] 'null_string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote_character' ]
                [ ESCAPE [ AS ] 'escape_character' ]
                [ FORCE NOT NULL column_name [, ...] ] ] ]

COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
    TO { 'filename' | STDOUT }
    [ [ WITH ]
          [ BINARY ]
          [ DELIMITER [ AS ] 'delimiter_character' ]
          [ NULL [ AS ] 'null_string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote_character' ]
                [ ESCAPE [ AS ] 'escape_character' ]
                [ FORCE QUOTE { column_name [, ...] | * } ] ] ]

注意在此语法中,BINARY 和 CSV 被视为独立的关键字,而不是 FORMAT 选项的参数。

以下语法在 PostgreSQL 7.3 版之前使用,目前仍受支持:

COPY [ BINARY ] table_name
    FROM { 'filename' | STDIN }
    [ [USING] DELIMITERS 'delimiter_character' ]
    [ WITH NULL AS 'null_string' ]

COPY [ BINARY ] table_name
    TO { 'filename' | STDOUT }
    [ [USING] DELIMITERS 'delimiter_character' ]
    [ WITH NULL AS 'null_string' ]

另请参阅

Section 27.4.3