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
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
不将指定列的值与空字符串匹配。在空字符串为空的默认情况下,这意味着即使未引用,空值也将被读作零长度字符串,而不是空值。如果指定 *
,该选项将会应用于所有列。该选项仅允许在 COPY FROM
中,且仅在使用 CSV
格式时才允许。
FORCE_NULL
将指定列的值与空字符串匹配,即使该值已被引用,且如果找到匹配项,则将该值设置为 NULL
。在空字符串为空的默认情况下,此操作会将已引用的空字符串转换为 NULL。如果指定 *
,该选项将会应用于所有列。该选项仅允许在 COPY FROM
中,且仅在使用 CSV
格式时才允许。
ON_ERROR
在遇到将列的输入值转换为其数据类型时发生的错误时,指定如何处理。
值 error_action
stop
表示命令失败,而 ignore
表示丢弃输入行并继续处理下一行。默认值为 stop
。
当 FORMAT
为 text
或 csv
时,ignore
选项仅适用于 COPY FROM
。
如果至少丢弃了一行,则会在 COPY FROM
结束时发出包含被忽略行计数的 NOTICE
消息。当 LOG_VERBOSITY
选项设置为 verbose
时,会为每个被丢弃的行发出一个包含输入文件行和输入转换失败的列名的 NOTICE
消息。
ENCODING
指定该文件已使用 encoding_name
编码。如果省略此选项,则将使用当前客户端编码。有关更多详情,请参阅以下注意事项。
LOG_VERBOSITY
指定通过 COPY
命令发送的消息数量:default
或 verbose
。如果指定 verbose
,处理期间将发送其他消息。
它当前在 COPY FROM
命令中使用,当 ON_ERROR
选项设置为 ignore
时。
其中
可选 WHERE
子句的一般形式为
WHERE 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
所读取值的表,你必须具有选择权限,对于 COPY FROM
所插入值的表,你必须具有插入权限。在命令中列出的列上具有列权限已足够。
如果对表启用了行级安全性,则相关的 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
将会引发错误。
可以使用仅包含反斜杠句点 (\.
) 的单行表示数据的结束。从文件读取时,数据结束标记不是必须的,因为文件结尾完全足够;仅当使用 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 |
反斜杠后跟一个到三个八进制数字指定具有该数字代码的字节 |
\x digits |
反斜杠 x 后跟一个或两个十六进制数字指定具有该数字代码的字节 |
目前,COPY TO
绝不会发出八进制或十六进制数字反斜杠序列,但它确实将上述其他序列用于这些控制字符。
任何未在上表中提到的其他反斜杠字符都将被视为代表其自身。但是,小心不要不必要地添加反斜杠,因为这可能会意外地生成一个字符串,该字符串与数据结束标记 (\.
) 或空字符串(默认情况下为 \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
格式中,所有字符都是重要的。带有空格或除 DELIMITER
之外的任何字符的引号包围值将包括这些字符。如果您从一个使用空格填充 CSV
行至某个固定宽度的系统中导入数据,这可能导致错误。如果出现这种情况,您可能需要预处理 CSV
文件以移除末尾空格,然后才能将数据导入 PostgreSQL 中。
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,则不包含。在 PostgreSQL 中不再支持 Oid 系统列,但此格式仍然包含指示符。
32 位整数,标头剩余部分的字节长度,不包括自身。目前,此值为零,第一个元组紧随其后。对格式的未来更改可能允许在头中显示其他数据。对于读者不知道如何处理的任何头扩展数据,应静默跳过。
构想中头扩展区包含一系列自我识别的块。标志字段并不打算告诉读者扩展区中有什么。头扩展内容的具体设计留给以后的版本。
此设计允许向后兼容的头添加(添加头扩展块或设置低阶标志位)和非向后兼容的更改(设置高阶标志位以指示此类更改,并在需要时将支持数据添加到扩展区)。
每个元组以一个 16 位整数计数开头,表示元组中的字段数。(目前,表中的所有元组都具有相同的计数,但这并不总是如此。)然后,针对元组中的每个字段重复,有一个 32 位长度字,后跟该数量的字段数据字节。(长度字不包括其自身,可以为零。)作为特例,-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 之前使用,并且仍受支持
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
' ]