2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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
    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 用户可执行的。当指定 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

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

注意

当使用 COPY FROM 时,任何匹配此字符串的数据项都将存储为 null 值,因此您应该确保使用的字符串与 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

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

FORMATtextcsv 时,ignore 选项仅适用于 COPY FROM

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

REJECT_LIMIT

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

ENCODING

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

LOG_VERBOSITY

指定 COPY 命令发出的消息量:defaultverbosesilent。如果指定了 verbose,则在处理过程中会发出额外的消息。silent 会抑制 verbose 和 default 消息。

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

WHERE

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

WHERE condition

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

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

输出

成功完成后,COPY 命令将返回一个形式为

COPY count

的命令标签。count 是复制的行数。

注意

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 读取的表值的 select 权限,以及对 COPY FROM 插入值的表的 insert 权限。对命令中列出的列拥有列权限就足够了。

如果表启用了行级安全,相关的 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。避免使用 IntervalStyle 设置为 sql_standard 来转储数据也是一个好主意,因为具有不同 IntervalStyle 设置的服务器可能会误解负区间值。

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

COPY FROM 命令在进行过程中物理地将输入行插入表中。如果命令失败,这些行将以已删除的状态保留;这些行将不可见,但仍占用磁盘空间。如果在大型复制操作中间发生故障,这可能会导致大量浪费的磁盘空间。VACUUM 应用于恢复浪费的空间。

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

文件格式

文本格式

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

数据结束可以用仅包含反斜杠点 (\.) 的行来表示。从文件读取时不需要结束数据标记,因为文件结束就足够了;在这种情况下,此规定仅为向后兼容。但是,psql 使用 \. 来终止 COPY FROM STDIN 操作(即在 SQL 脚本中读取内联 COPY 数据)。在这种情况下,需要此规则才能在脚本结束前结束操作。

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

COPY TO 发送指定的 null 字符串而不添加任何反斜杠;相反,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 值和空字符串。PostgreSQLCOPY 通过引用来处理此问题。 NULL 输出为 NULL 参数字符串并且不被引用,而与 NULL 参数字符串匹配的非 NULL 值将被引用。例如,在默认设置下,NULL 被写成一个不带引号的空字符串,而空字符串数据值被写成双引号 ("")。读取值遵循类似的规则。您可以使用 FORCE_NOT_NULL 来阻止对特定列进行 NULL 输入比较。您也可以使用 FORCE_NULL 将带引号的 null 字符串数据值转换为 NULL

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

注意

v18 之前的 PostgreSQL 版本总是将不带引号的 \. 识别为结束数据标记,即使是从单独的文件读取。为了与旧版本兼容,COPY TO 将对行中单独的 \. 进行引用,尽管这已不再是必需的。

注意

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 的情况下,后面没有值字节。

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

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

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

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

文件尾

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

如果字段计数词既不是 -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。所有行在第三列中都有一个 null 值。

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 节

提交更正

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