COPY — 在文件和表之间复制数据
COPYtable_name
[ (column_name
[, ...] ) ] FROM { 'filename
' | PROGRAM 'command
' | STDIN } [ [ WITH ] (option
[, ...] ) ] [ WHEREcondition
] COPY {table_name
[ (column_name
[, ...] ) ] | (query
) } TO { 'filename
' | PROGRAM 'command
' | STDOUT } [ [ WITH ] (option
[, ...] ) ] whereoption
can be one of: FORMATformat_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_ERRORerror_action
REJECT_LIMITmaxerror
ENCODING 'encoding_name
' LOG_VERBOSITYverbosity
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
视图中报告其进度。有关详细信息,请参阅 第 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
。有关详细信息,请参阅下面的 文件格式。
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
指定在将列的输入值转换为其数据类型时遇到错误时如何处理。值为 stop
的 error_action
表示使命令失败,而 ignore
表示丢弃输入行并继续处理下一行。默认值为 stop
。
当 FORMAT
为 text
或 csv
时,ignore
选项仅适用于 COPY FROM
。
如果在 COPY FROM
结束时至少有一行被丢弃,则会发出一个包含被丢弃行数的 NOTICE
消息。当 LOG_VERBOSITY
选项设置为 verbose
时,对于每一行被丢弃的行,都会发出一个包含输入文件行和输入转换失败的列名的 NOTICE
消息。当设置为 silent
时,不会发出有关被丢弃行的消息。
REJECT_LIMIT
当 ON_ERROR
设置为 ignore
时,指定在将列的输入值转换为其数据类型时允许的最大错误数。如果输入引起的错误超过指定值,即使 ON_ERROR
设置为 ignore
,COPY
命令也会失败。此子句必须与 ON_ERROR
=ignore
一起使用,并且 maxerror
必须是正整数 bigint
。如果未指定,ON_ERROR
=ignore
允许无限数量的错误,这意味着 COPY
将跳过所有错误数据。
ENCODING
指定文件以 encoding_name
编码。如果省略此选项,则使用当前的客户端编码。有关更多详细信息,请参阅下面的注释。
LOG_VERBOSITY
指定 COPY
命令发出的消息量:default
、verbose
或 silent
。如果指定了 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
TOSELECT * FROM ONLY
相同。但是,它不直接支持其他关系类型,例如分区表、继承子表或视图。要复制这些关系中的所有行,请使用 table
COPY (SELECT * FROM
。table
) TO
COPY FROM
可与普通表、外部表、分区表或具有 INSTEAD OF INSERT
触发器的视图一起使用。
您必须拥有对 COPY TO
读取的表值的 select 权限,以及对 COPY FROM
插入值的表的 insert 权限。对命令中列出的列拥有列权限就足够了。
如果表启用了行级安全,相关的 SELECT
策略将适用于 COPY
语句。目前,对于具有行级安全功能的表,不支持 table
TOCOPY 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
的影响。为确保可移植到可能使用非默认 DateStyle
设置的其他 PostgreSQL 安装,在使用 COPY TO
之前应将 DateStyle
设置为 ISO
。避免使用 IntervalStyle
设置为 sql_standard
来转储数据也是一个好主意,因为具有不同 IntervalStyle
设置的服务器可能会误解负区间值。
输入数据根据 ENCODING
选项或当前客户端编码进行解释,输出数据以 ENCODING
或当前客户端编码进行编码,即使数据不通过客户端而是由服务器直接从文件读取或写入文件。
COPY FROM
命令在进行过程中物理地将输入行插入表中。如果命令失败,这些行将以已删除的状态保留;这些行将不可见,但仍占用磁盘空间。如果在大型复制操作中间发生故障,这可能会导致大量浪费的磁盘空间。VACUUM
应用于恢复浪费的空间。
FORCE_NULL
和 FORCE_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 |
反斜杠后跟一个到三个八进制数字表示具有该数字代码的字节 |
\x digits |
反斜杠 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
) 文件格式。它不使用 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
模式下。
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 保留用于指示向后兼容的格式问题;如果读取器发现此范围内的任何意外设置的位,它应该直接忽略。目前只有一个标志位已定义,其余必须为零
如果为 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 之前使用了以下语法,并且仍然支持
COPYtable_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 NULLcolumn_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
' ]
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 来报告文档问题。