COPY

限制:请勿使用 COPY 命令。 要进行加载或卸载操作,请使用 "nzload命令或 CREATE EXTERNAL TABLE 命令。 这些命令比 COPY 命令更快、更稳定。 这里记录 COPY 命令是因为它用于内部操作。

COPY 命令在表格和标准文件系统文件之间移动数据。 使用带有文件名的 COPY 命令可直接读取或写入文件。
  • 使用 COPY TO 命令将表格的全部内容复制到文件中。 COPY TO 命令对列缺省值不起作用。
  • 使用 COPY FROM 命令将数据从文件复制到表中。 如果表中已有数据,命令会追加到表中。

SQL92 中没有 COPY 命令。 可以对普通表使用 COPY 命令,但不能对视图使用 COPY 命令。

使用 COPY 命令时,系统会读取或写入一个文本文件,每个表格行一行。 分隔符用于分隔一行中的列(属性)。 属性值是输出函数为每个属性的数据类型生成的字符串,或者是输入函数可以接受的字符串。 系统使用指定的空值字符串代替空属性。

默认情况下,文本副本使用制表符("\t")作为字段之间的分隔符。 通过使用分隔符,您可以将字段分隔符改为任何其他带有关键字短语的单字符。 对于与分隔符匹配的数据字段,系统会使用反斜杠引号字符。 您可以用包含反斜线句号 (\.) 的单行来表示数据结束。从 UNIX 文件读取数据时不需要数据结束标记,但在向客户端应用程序拷贝数据或从客户端应用程序拷贝数据时,必须提供结束标记。

COPY 命令会在第一次出错时停止运行。 对于 COPY FROM 命令来说,这不是一个问题。 对于 COPY TO 命令,目标关系中已经接收了较早的记录。 这些行不可见或不可访问,但仍占用磁盘空间。 如果故障发生在大型复制操作中,可能会浪费大量磁盘空间。

您可以在 COPY 命令数据中使用反斜线字符 (\) 来引用数据字符,否则这些字符可能会被认为是行或列分隔符。 具体来说,以下字符如果显示为属性值的一部分,必须在其前面加上反斜线:反斜线本身、换行符和当前分隔符。

使用文件名时,一定要指定绝对路径。 对于 COPY TO 命令,数据库服务器会强制执行绝对路径,但对于 COPY FROM 命令,您可以选择从相对路径指定的文件读取数据。 系统解释相对于数据库服务器工作目录的路径,而不是Netezza Performance ServerSQL 工作目录。

下表描述了 COPY FROM 命令的反斜线序列。
表 1. COPY FROM 反斜线序列
序列 表示
\b 退格(ASCII 8)
\f 换页(ASCII 12)
\n 新行(ASCII 10)
\r 回车(ASCII 13)
\t 制表符(ASCII 9)
\v 垂直制表符(ASCII 11)
\数字 反斜线后跟一至三个八进制数字,表示具有该数字代码的字符。

COPY TO 命令不输出八进制数字反斜杠序列,但会使用上表中列出的其他序列来输出这些控制字符。

限制:不要在数据字符 N 或句点 (.) 前添加反斜杠。此类字符对会被误认为默认空字符串或数据结束标记。 上表中未提及的任何其他反斜杠字符都被视为代表自身。

生成 COPY 命令数据的应用程序会将数据换行转换为 \n 序列,并将回车转换为 \r 序列。

每一行的末尾都有一个 UNIX 风格的换行符("\n")。 COPY FROM 命令不能在包含 DOS 或 Mac 风格换行符的文件中正常运行。

语法

来自客户端应用程序的输入语法:
COPY [BINARY] table 
    FROM { 'file name' | stdin }
    [ [USING] DELIMITERS 'delimiter' ]
    [ WITH NULL AS 'null string' ];
输出到客户端应用程序的语法:
COPY table 
    TO { 'file name' | stdout }
    [ [USING] DELIMITERS 'delimiter' ]
    [ WITH NULL AS 'null string' ];

输入

COPY 命令接受以下输入:

表 2. COPY 输入
输入 描述
BINARY 更改字段格式化的行为。 强制所有数据以二进制格式而非文本格式存储或读取。
分隔符 分隔文件每一行字段的字符。
文件名 输入或输出文件的绝对路径名称。
空字符串 表示 NULL 值的字符串。 默认为"\N"(反斜线-N)。

在复制时,任何与该字符串匹配的数据项都将存储为空值。 确保使用与复制时相同的字符串。

标准输入 输入来自客户端应用程序。
标准输出 输出到客户端应用程序。
现有表格的名称。

输出

COPY 命令有以下输出。
表 3. COPY 输出
输出 描述
COPY 如果复制成功,系统将返回此信息。
ERROR: reason 如果复制失败,系统将返回此信息并说明失败原因。

特权

您必须在 COPY 命令读取其值的任何表上拥有选择权限。 您必须对 COPY 命令要插入值的表拥有插入或更新权限。 对于 COPY 命令读取或写入的任何文件,数据库服务器必须具有适当的权限。

用途

以下是使用示例。
  • 使用垂直条 (|) 作为字段分隔符,将表格复制到标准输出:
    MYDB.SCH1(USER)=> COPY country TO stdout USING DELIMITERS '|';
  • 将 UNIX 文件中的数据复制到表国:
    MYDB.SCH1(USER)=> COPY country FROM
    '/usr1/proj/bray/sql/country_data';
  • 这是一个适合从 stdin 复制到表中的数据样本(因此在最后一行有终止序列):
    AF      AFGHANISTAN
    AL      ALBANIA
    DZ      ALGERIA
    ZM      ZAMBIA
    ZW      ZIMBABWE
    \.