支持的版本: 当前 (17) / 16 / 15 / 14 / 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

COPY

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

概要

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
    ENCODING 'encoding_name'
    LOG_VERBOSITY verbosity

描述

COPYPostgreSQL 表和标准文件系统文件之间移动数据。COPY TO 将表的内容复制一个文件,而 COPY FROM 将数据一个文件复制到一个表(将数据附加到表中已有的任何内容)。COPY TO 还可以复制 SELECT 查询的结果。

如果指定了列列表,则 COPY TO 仅将指定列中的数据复制到文件。对于 COPY FROM,文件中的每个字段都按顺序插入到指定的列中。COPY FROM 列列表中未指定的表列将接收其默认值。

带有文件名的 COPY 指示 PostgreSQL 服务器直接从文件读取或写入文件。该文件必须可由 PostgreSQL 用户(服务器运行的用户 ID)访问,并且名称必须从服务器的角度指定。当指定 PROGRAM 时,服务器将执行给定的命令并从程序的标准输出读取,或者写入程序的标准输入。该命令必须从服务器的角度指定,并且可由 PostgreSQL 用户执行。当指定 STDINSTDOUT 时,数据将通过客户端和服务器之间的连接传输。

每个运行 COPY 的后端都会在 pg_stat_progress_copy 视图中报告其进度。有关详细信息,请参见 第 27.4.3 节

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

参数

table_name

现有表的名称(可选的模式限定)。

column_name

要复制的可选列列表。如果未指定列列表,则将复制表的所有列,但生成的列除外。

query

一个 SELECTVALUESINSERTUPDATEDELETEMERGE 命令,其结果将被复制。请注意,查询周围需要括号。

对于 INSERTUPDATEDELETEMERGE 查询,必须提供 RETURNING 子句,并且目标关系不能有条件规则,也不能有扩展为多个语句的 ALSO 规则或 INSTEAD 规则。

filename

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

PROGRAM

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

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

STDIN

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

STDOUT

指定输出到客户端应用程序。

boolean

指定是否应启用或禁用所选选项。您可以写入 TRUEON1 来启用该选项,并写入 FALSEOFF0 来禁用它。boolean 值也可以省略,在这种情况下,假定为 TRUE

FORMAT

选择要读取或写入的数据格式:textcsv(逗号分隔值)或 binary。默认为 text

FREEZE

请求复制已冻结的行的数据,就像在运行 VACUUM FREEZE 命令后一样。这旨在作为初始数据加载的性能选项。只有在当前子事务中创建或截断了正在加载的表,没有打开的游标,并且此事务没有保留较旧的快照时,行才会被冻结。当前无法在分区表上执行 COPY FREEZE。此选项仅在 COPY FROM 中允许。

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

DELIMITER

指定分隔文件中每行(行)中列的字符。默认情况下,文本格式为制表符,CSV 格式为逗号。这必须是单个单字节字符。使用 binary 格式时,不允许使用此选项。

NULL

指定表示空值的字符串。默认情况下,文本格式为 \N(反斜杠 N),CSV 格式为未加引号的空字符串。在您不想区分空值和空字符串的情况下,您可能更喜欢文本格式中的空字符串。使用 binary 格式时,不允许使用此选项。

注意

当使用 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

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

FORCE_NULL

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

ON_ERROR

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

ignore 选项仅适用于 COPY FROMFORMATtextcsv 时。

如果至少有一行被丢弃,则在 COPY FROM 结束时会发出一个包含被忽略行数的 NOTICE 消息。当 LOG_VERBOSITY 选项设置为 verbose 时,对于每个被丢弃的行,都会发出一个 NOTICE 消息,其中包含输入文件的行和输入转换失败的列名。

ENCODING

指定文件以 encoding_name 编码。如果省略此选项,则使用当前客户端编码。有关更多详细信息,请参见下面的“备注”。

LOG_VERBOSITY

指定 COPY 命令发出的消息量:defaultverbose。如果指定了 verbose,则在处理期间会发出其他消息。

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

WHERE

可选的 WHERE 子句具有以下通用形式

WHERE condition

其中 condition 是任何计算结果为 boolean 类型的表达式。任何不满足此条件的行都不会插入到表中。如果将实际行值替换为任何变量引用时返回 true,则该行满足条件。

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

输出

成功完成后,COPY 命令返回以下形式的命令标签

COPY count

其中 count 是复制的行数。

注意

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

备注

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_filespg_write_server_filespg_execute_server_program 之一的用户使用,因为它允许读取或写入服务器有权访问的任何文件或运行程序。

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

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

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

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

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

COPY 输入和输出受 DateStyle 的影响。为了确保可移植到可能使用非默认 DateStyle 设置的其他 PostgreSQL 安装,应在使用 COPY TO 之前将 DateStyle 设置为 ISO。避免使用设置为 sql_standardIntervalStyle 转储数据也是一个好主意,因为具有不同 IntervalStyle 设置的服务器可能会错误解释负间隔值。

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

COPY FROM 命令会在进行过程中将输入行物理插入到表中。如果命令失败,这些行将处于删除状态;这些行将不可见,但仍会占用磁盘空间。如果在大型复制操作中途发生故障,则可能会浪费大量磁盘空间。应使用 VACUUM 来回收浪费的空间。

FORCE_NULLFORCE_NOT_NULL 可以同时在同一列上使用。这会导致将带引号的空字符串转换为空值,并将不带引号的空字符串转换为空字符串。

文件格式

文本格式

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

数据的结尾可以用仅包含反斜杠句点 (\.) 的单行表示。从文件读取时不需要数据结束标记,因为文件结尾完全可以满足要求;仅当使用 pre-3.0 客户端协议将数据复制到客户端应用程序或从客户端应用程序复制数据时才需要它。

反斜杠字符 (\) 可在 COPY 数据中用于引用可能被视为行或列分隔符的数据字符。特别是,以下字符 必须 在作为列值的一部分出现时前面加上反斜杠:反斜杠本身、换行符、回车符和当前分隔符字符。

指定的空字符串由 COPY TO 发送,不添加任何反斜杠;相反,COPY FROM 会在删除反斜杠之前将输入与空字符串进行匹配。因此,诸如 \N 之类的空字符串不会与实际数据值 \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 永远不会发出八进制或十六进制数字反斜杠序列,但它确实对那些控制字符使用上面列出的其他序列。

上面表中未提及的任何其他带反斜杠的字符都将被视为表示自身。但是,请注意不要不必要地添加反斜杠,因为这可能会意外生成与数据结束标记 (\.) 或空字符串 (\N,默认为) 匹配的字符串。这些字符串将在完成任何其他反斜杠处理之前被识别。

强烈建议生成 COPY 数据的应用程序将数据换行符和回车符分别转换为 \n\r 序列。目前,可以使用反斜杠和回车符来表示数据回车符,并使用反斜杠和换行符来表示数据换行符。但是,这些表示形式在未来的版本中可能不被接受。如果 COPY 文件在不同的机器之间传输(例如,从 Unix 到 Windows 或反之亦然),它们也极易损坏。

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

COPY TO 将以 Unix 风格的换行符(\n)结束每一行。在 Microsoft Windows 上运行的服务器则输出回车符/换行符(\r\n),但仅适用于 COPY 到服务器文件;为了跨平台的一致性,无论服务器平台如何,COPY TO STDOUT 始终发送 \nCOPY FROM 可以处理以换行符、回车符或回车符/换行符结尾的行。为了减少由于未加反斜杠的换行符或原本作为数据的回车符而导致的错误风险,如果输入中的行尾符不完全相同,COPY FROM 将会报错。

CSV 格式

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

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

CSV 格式没有标准的区分 NULL 值和空字符串的方法。PostgreSQLCOPY 通过使用引号来处理此问题。NULL 值作为 NULL 参数字符串输出,并且不加引号,而与 NULL 参数字符串匹配的非 NULL 值将加引号。例如,使用默认设置,NULL 值将写入为未加引号的空字符串,而空字符串数据值则使用双引号 ( "" ) 写入。读取值遵循类似的规则。您可以使用 FORCE_NOT_NULL 来防止对特定列进行 NULL 输入比较。您还可以使用 FORCE_NULL 将带引号的 null 字符串数据值转换为 NULL

由于反斜杠在 CSV 格式中不是特殊字符,因此结束数据标记 \. 也可能作为数据值出现。为避免任何误解,在输出时,作为单行条目出现的 \. 数据值会自动加上引号;在输入时,如果加上引号,则不会将其解释为结束数据标记。如果您正在加载由另一个应用程序创建的,并且可能包含值 \. 的单列未加引号的文件,则可能需要在输入文件中对该值加上引号。

注意

CSV 格式中,所有字符都很重要。用空格或 DELIMITER 以外的任何字符包围的带引号的值将包含这些字符。如果您从某个系统导入数据,该系统使用空格将 CSV 行填充到某个固定宽度,则这可能会导致错误。如果出现这种情况,您可能需要在将数据导入 PostgreSQL 之前预处理 CSV 文件以删除尾随空格。

注意

CSV 格式将识别并生成包含嵌入式回车符和换行符的带引号值的 CSV 文件。因此,这些文件不像文本格式文件那样严格地每行对应一个表行。

注意

许多程序会生成奇怪且偶尔反常的 CSV 文件,因此文件格式与其说是标准,不如说是一种约定。因此,您可能会遇到一些无法使用此机制导入的文件,并且 COPY 可能会生成其他程序无法处理的文件。

二进制格式

binary 格式选项会导致所有数据都以二进制格式而不是文本格式存储/读取。它比文本和 CSV 格式稍快,但是二进制格式文件在跨机器架构和 PostgreSQL 版本之间的可移植性较差。此外,二进制格式非常特定于数据类型;例如,将二进制数据从 smallint 列输出并将其读入 integer 列将不起作用,即使在文本格式下可以正常工作。

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

注意

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,则不包含。OID 系统列在 PostgreSQL 中不再受支持,但是该格式仍然包含指示符。

头扩展区域长度

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 [, ...] | * } ] ] ]

请注意,在这种语法中,BINARYCSV 被视为独立的关键字,而不是 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' ]

另请参阅

第 27.4.3 节

提交更正

如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单来报告文档问题。