COPY

Name


COPY -- 在表和文件之间拷贝数据


Synopsis

COPY table_name [ ( column [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

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

where option can be one of:

    FORMAT format_name
    OIDS [ boolean ]
    DELIMITER 'delimiter_character'
    NULL 'null_string'
    HEADER [ boolean ]
    QUOTE 'quote_character'
    ESCAPE 'escape_character'
    FORCE_QUOTE { ( column [, ...] ) | * }
    FORCE_NOT_NULL ( column [, ...] )



描述

COPY在表和文件之间交换数据。COPY TO 把一个表的所有内容都拷贝到一个文件,而COPY FROM从一个文件 里拷贝数据到一个表里(把数据附加到表中已经存在的内容里)。COPY TO 还能拷贝SELECT查询的结果。

如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。 如果表中有任何不在字段列表里的字段,那么COPY FROM将为那些字段插入缺省值。

带文件名的COPY指示PostgreSQL服务器直接 从文件中读写数据。如果声明了文件名,那么服务器必须可以访问该文件,而且文件名必须从 服务器的角度声明。如果指定了STDIN或STDOUT,那么 数据将在客户前端和服务器之间流动。

参数


table_name


现存表的名字(可以有模式修饰)。


column


可选的待拷贝字段列表。如果没有声明字段列表,那么将使用所有字段。


query


一个必须用圆括弧包围的SELECTVALUES 命令,其结果将被拷贝。


filename


输入或输出文件的绝对路径。Windows用户可能需要使用E''字符串 和双反斜线作为路径名称。


STDIN

声明输入是来自客户端应用。


STDOUT

声明输入前往客户端应用。


boolean


声明选的选项是否应该被开启或者关闭。您可以写 TRUE, ON, 或者1来启用这个选项,并且用FALSE, OFF,或者0 来关闭它。 boolean值也可以被省略,此时 假定为TRUE。


FORMAT

选择被读或者写的数据格式: text, csv(逗号分隔值), 或者binary。 默认是text。


OIDS

声明为每行拷贝内部对象标识(OID)。如果为一个 query拷贝或者没有OID的 表声明了OIDS选项,则抛出一个错误。


DELIMITER

指定分隔每一行(排)中的列的字符。默认是文本格式的制表符,CSV格式的逗号。 必须有一个独立的一字节的字符。 在使用binary格式时这个选项是不允许的。


NULL

This option is not allowed when using binary format. 声明代表一个空值的字符串。默认是文本格式的\N (backslash-N), CSV格式的一个未被引用的空字符串。即使是文本格式您可能也更偏向于空串, 例如您不想从空字符串中区分空值。



Note: 在使用COPY FROM的时候,任何匹配这个字符串的字符串将 被存储为NULL值,所以你应该确保你用的字符串和COPY TO相同。


HEADER

声明文件包含一个带有文件中每列名称的标题行。在输出时,第一行包含表中的列名, 在输入时,第一行是被忽略的。该选项仅仅在使用CSV格式时是允许的。


QUOTE

在数值被引用后指定要使用的引用字符。默认的是双引号。这一定是一个1字节的字符。 该选项仅仅在使用CSV格式时允许。


ESCAPE

声明应该出现在一个匹配QUOTE值的数据字符之前的字符。 默认与QUOTE值相同(所以若它出现在数据中,则引用字符是翻一倍)。 这一定是一个1字节的字符。该选项只有在使用CSV格式时允许。


FORCE_QUOTE

强制引用在每个指定列的所有非空值。空输出从不被引用。 如果声明了*,非空值将在所有列中被引用。这个选项仅仅在 COPY TO中并且仅仅在使用CSV格式时允许。


FORCE_NOT_NULL

默认情况下空字符串是空的,这意味着空值将会被读作长度为零的字符串而不是空值, 即使当他们不被引用。这个选项仅仅在COPY FROM中并且仅仅在使用 CSV

输出

成功完成时,COPY按照如下格式返回一个命令标签:



COPY count



其中的count是拷贝的行数。


注意

COPY只能用于表,不能用于视图。当然也可以用于 COPY (SELECT * FROM viewname) TO ...。

COPY仅仅处理命名了的特定表;它将不复制数据到子表或从子表 中复制数据。因此比如COPY table 显示与SELECT * FROM ONLY table 相同的数据。但是COPY (SELECT * FROMtable) TO ...

COPY TO出来的数据必须有选取数据的权限, 对任何要COPY FROM入数据的表必须有插入权限。 对列在命令中的列拥有列权限是足够的。

COPY命令里面的文件必须是由服务器直接读或写的文件, 而不是由客户端应用读写。因此,它们必须位于数据库服务器上或者可以被数据库 服务器所访问,这些事情不应该由客户端来做。它们必须被运行 PostgreSQL服务器的用户可读或写, 而不是客户端。只允许数据库超级用户COPY一个文件, 因为它允许读写任意服务器有权限访问的文件。

不要混淆COPY和psql的 \copy指令。\copy调用 COPY FROM STDIN或COPY TO STDOUT,然后把数据抓取/存储到一个psql因此,使用\copy的时候,文件访问 权限是由客户端而不是服务器端决定的。

COPY里的文件名字总是使用绝对路径。 在COPY TO的时候是由服务器强制进行的,但是对于 COPY FROM,你的确可从一个相对路径的文件里读取。 该路径将解释为相对于服务器的工作目录(通常是数据目录),而不是客户 端的工作目录。

COPY FROM会激活所有触发器和检查约束。不过,不会激活规则。

COPY输入和输出被DateStyle影响。 为了和其它PostgreSQL安装移植(它们可能是非缺省 DateStyle设置),应该在使用COPY TO前把 DateStyle设置为ISO。 通过将IntervalStyle设置为sql_standard来避免转储数据 也是一个好主意。因为负的区间值可能会被对IntervalStyle有不同设置的 服务器误解。

Input data is interpreted according to the current client encoding, and output data is encoded in the current client encoding, even if the data does not pass through the client but is read from or written to a file directly by the server. 输入数据通过当前客户机编码来解译,输出数据被编码为当前客户机编码, 即使数据不经过客户端的,仍会通过服务器直接将数据从文件中读出或者写入到文件中去。

COPY在第一个错误处停下来。这些在COPY TO 中不应该导致问题,但在COPY FROM时目标表会已经接收到早先的行, 这些行将不可见或不可访问,但是仍然会占据磁盘空间。如果你碰巧拷贝大块数据文件的话, 这些东西积累起来可能会占据相当大的磁盘空间。你可以调用VACUUM