Manpages

NAME

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

SYNOPSIS

COPY tablename [ ( column [, ...] ) ]
FROM { ’filename’ | STDIN }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] ’delimiter’ ]
[ NULL [ AS ] ’null string’ ] ]

COPY tablename [ ( column [, ...] ) ]
TO { ’filename’ | STDOUT }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] ’delimiter’ ]
[ NULL [ AS ] ’null string’ ] ]

DESCRIPTION 描 述

COPY 在 PostgreSQL表 和 标 准 文 件 系 统 文 件 之 间 交 换 数 据 。 COPY TO 把 一 个 表 的 所 有 内 容 都 拷 贝 到 一 个 文 件 , 而 COPY FROM 从 一 个 文 件 里 拷 贝 数 据 到 一 个 表 里 ( 把 数 据 附 加 到 表 中 已 经 存 在 的 内 容 里 ) 。 如 果 声 明 了 一 个 字 段 列 表 , COPY 将 只 在 文 件 和 表 之 间 拷 贝 声 明 的 字 段 的 数 据 。 如 果 表 中 有 任 何 不 在 字 段 列 表 里 的 字 段 , 那 么 COPY FROM 将 为 那 些 字 段 插 入 缺 省 值 。 带 文 件 名 的 COPY 指 示 PostgreSQL 服 务 器 直 接 从 文 件 中 读 写 数 据 。 如 果 声 明 了 文 件 名 , 那 么 该 文 件 必 须 为 服 务 器 可 见 , 而 且 文 件 名 必 须 从 服 务 器 的 角 度 声 明 。 如 果 声 明 的 是 STDIN 或 STDOUT, 数 据 通 过 连 接 在 客 户 前 端 和 服 务 器 之 间 流 动 。

PARAMETERS 参 数

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

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

filename 输 入 或 输 出 文 件 的 绝 对 路 径 名 。

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

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

BINARY 使 用 二 进 制 格 式 存 储 和 读 取 , 而 不 是 以 文 本 的 方 式 。 在 二 进 制 模 式 下 , 不 能 声 明

DELIMITERS和 NULL。

OIDS 声 明 为 每 行 拷 贝 内 部 对 象 标 识 (

OID) 。 ( 如 果 给 那 些 没 有 OID 的 表 声

明 了 OIDS 选 项 , 则 抛 出 一 个 错 误 。 )

delimiter 用 于 在 文 件 中 每 行 中 分 隔 各 个 字 段 的 单 个 字 符 。 缺 省 是 水 平 制 表 符 。 ( tab)
null string
一 个 代 表 NULL 值 的 字 串 。 缺 省 是 \N ( 反 斜 杠 -N) 。 当 然 , 你 可 以 自 己 挑 一 个 空 字 串 。

Note: 注 意 : 对 于 COPY FROM, 任 何 匹 配 这 个 字 串 的 字 串 将 被 存 储 为 NULL 值 , 所 以 你 应 该 确 保 你 用 的 字 串 和 COPY TO相 同 。

NOTES 注 意

COPY 只 能 用 于 表 , 不 能 用 于 视 图 。

BINARY 关 键 字 将 强 制 使 用 二 进 制 对 象 而 不 是 文 本 存 储 /读 取 所 有 数 据 。 这 样 做 在 一 定 程 度 上 比 传 统 的 拷 贝 命 令 快 , 但 二 进 制 拷 贝 文 件 在 不 同 机 器 体 系 间 的 植 性 不 是 很 好 。 你 对 任 何 要 COPY TO 出 来 的 数 据 必 须 有 选 取 数 据 的 权 限 , 对 任 何 要 COPY FROM 入 数 据 的 表 必 须 有 插 入 权 限 。

COPY 命 令 里 面 的 文 件 必 须 是 由 服 务 器 直 接 读 或 写 的 文 件 , 而 不 是 由 客 户 端 应 用 读 写 。 因 此 , 它 们 必 须 位 于 数 据 库 服 务 器 上 或 者 可 以 为 数 据 库 服 务 器 所 访 问 , 而 不 是 由 客 户 端 做 这 些 事 情 。 它 们 必 须 是 PostgreSQL用 户 ( 服 务 器 运 行 的 用 户 ID) 可 以 访 问 到 并 且 可 读 或 者 可 写 , 而 不 是 客 户 端 。 COPY 到 一 个 命 名 文 件 是 只 允 许 数 据 库 超 级 用 户 进 行 的 , 因 为 它 允 许 读 写 任 意 服 务 器 有 权 限 访 问 的 文 件 。 不 要 混 淆 COPY 和 psql 指 令 \copy\copy 调 用 COPY FROM STDIN 或 者 COPY TO STDOUT, 然 后 把 数 据 抓 取 /存 储 到 一 个 psql 客 户 端 可 以 访 问 的 文 件 中 。 因 此 , 使 用 \copy 的 时 候 , 文 件 访 问 权 限 是 由 客 户 端 而 不 是 服 务 器 端 决 定 的 。 我 们 建 议 在 COPY 里 的 文 件 名 字 总 是 使 用 绝 对 路 径 。 在 COPY TO 的 时 候 是 由 服 务 器 强 制 进 行 的 , 但 是 对 于 COPY FROM, 你 的 确 有 从 一 个 声 明 为 相 对 路 径 的 文 件 里 读 取 的 选 择 。 该 路 径 将 解 释 为 相 对 于 服 务 器 的 工 作 目 录 ( 在 数 据 目 录 里 的 什 么 地 方 ) , 而 不 是 客 户 端 的 工 作 目 录 。

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

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

FILE FORMATS 文 件 格 式

TEXT FORMAT 文 本 格 式 当 不 带 BINARY 选 项 使 用 COPY 时 , 读 写 的 文 件 是 一 个 文 本 文 件 , 每 行 代 表 表 中 一 个 行 。 行 中 的 列 ( 字 段 ) 用 分 隔 符 分 开 。 字 段 值 本 身 是 由 与 每 个 字 段 类 型 相 关 的 输 出 函 数 生 成 的 字 符 串 , 或 者 是 输 入 函 数 可 接 受 的 字 串 。 数 据 中 使 用 特 定 的 空 值 字 串 表 示 那 些 为 NULL 的 字 段 。 如 果 输 入 文 件 的 任 意 行 包 含 比 预 期 多 或 者 少 的 字 段 , 那 么 COPY FROM 将 抛 出 一 个 错 误 。 如 果 声 明 了 OIDS, 那 么 OID 将 作 为 第 一 个 字 段 读 写 , 放 在 所 有 用 户 字 段 前 面 。 数 据 的 结 束 可 以 用 一 个 只 包 含 反 斜 扛 和 句 点 ( \.) 的 行 表 示 。 如 果 从 文 件 中 读 取 数 据 , 那 么 数 据 结 束 的 标 记 是 不 必 要 的 , 因 为 文 件 结 束 起 的 作 用 就 很 好 了 ; 但 是 在 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 (反 斜 杠 , 后 面 是 三 个 八 进 制 数 值 , 代 表 具 有 指 定 值 的 字 符 ) 目 前 , COPY TO 将 绝 不 会 发 出 一 个 八 进 制 反 斜 扛 序 列 , 但 是 它 的 确 使 用 了 上 面 列 出 的 其 它 字 符 用 于 控 制 字 符 。 绝 对 不 要 把 反 斜 扛 放 在 一 个 数 据 字 符 N或 者 句 点 ( .) 前 面 。 这 样 的 组 合 将 分 别 被 误 认 为 是 空 字 串 (\.) 或 者 数 据 结 束 标 记 (\N)。 另 外 一 个 没 有 在 上 面 的 表 中 列 出 的 反 斜 扛 字 符 就 是 它 自 己 。 我 们 强 烈 建 议 生 成 COPY 数 据 的 应 用 八 换 行 符 和 回 车 分 别 转 换 成 \n 和 \r 序 列 。 目 前 我 们 可 以 用 一 个 反 斜 杠 和 一 个 回 车 表 示 一 个 数 据 回 车 , 以 及 用 一 个 反 斜 扛 和 一 个 换 行 符 表 示 一 个 数 据 换 行 符 。 不 过 , 这 样 的 表 示 在 将 来 的 版 本 中 缺 省 时 可 能 不 会 被 接 受 。

They are also highly vulnerable to corruption if the COPY file is transferred across different machines (for example, from Unix to Windows or vice versa).

COPY TO 将 再 每 行 的 结 尾 是 用 一 个 Unix 风 格 的 换 行 符 ("\n"), 或 者 是 在 MS Windows 上 运 行 的 服 务 器 上 用 ( "\r\n") 标 记 一 行 终 止 , 但 只 是 用 于 COPY到 服 务 器 文 件 里 ; 为 了 在 不 同 平 台 之 间 一 致 , COPY TO STDOUT 总 是 发 送 "\n", 不 管 服 务 器 平 台 是 什 么 。 COPY FROM 可 以 处 理 那 些 以 回 车 符 , 或 者 换 行 符 , 或 者 回 车 换 行 符 作 为 行 结 束 的 数 据 。 为 了 减 少 在 数 据 中 出 现 的 未 逃 逸 的 新 行 或 者 回 车 导 致 的 错 误 , 如 果 输 入 的 行 结 尾 不 像 上 面 这 些 符 号 , COPY FROM 会 发 出 警 告 。

BINARY FORMAT 二 进 制 格 式 在 PostgreSQL 7.4 中 的 COPY BINARY 的 文 件 格 式 做 了 变 化 。 新 格 式 由 一 个 文 件 头 , 零 或 多 条 元 组 , 以 及 文 件 尾 组 成 。 文 件 头 和 数 据 现 在 是 网 络 字 节 序 。

FILE HEADER 文 件 头 文 件 头 由 15 个 字 节 的 固 定 域 组 成 , 后 面 跟 着 一 个 变 长 的 头 扩 展 区 。 固 定 域 是 :
Signature 签 名

11-字 节 的 序 列 PGCOPY\n\377\r\n\0 --- 请 注 意 字 节 零 是 签 名 是 要 求 的 一 部 分 。 ( 使 用 这 个 签 名 是 为 了 让 我 们 能 够 很 容 易 看 出 文 件 是 否 已 经 被 一 个 非 8 位 安 全 的 转 换 器 给 糟 蹋 了 。 这 个 签 名 会 被 行 结 尾 转 换 过 滤 器 , 删 除 字 节 零 , 删 除 高 位 , 或 者 奇 偶 的 改 变 而 改 变 。 )

Flags field 标 志 域

32 位 整 数 掩 码 表 示 该 文 件 格 式 的 重 要 方 面 。 位 是 从 0( LSB) 到 31 ( MSB) 编 码 的 --- 请 注 意 这 个 域 是 以 网 络 字 节 序 存 储 的 ( 高 位 在 前 ) , 后 继 的 整 数 都 是 如 此 。 位 16 - 31 是 保 留 用 做 关 键 文 件 格 式 信 息 的 ; 如 果 读 者 发 现 一 个 不 认 识 的 位 出 现 在 这 个 范 围 内 , 那 么 它 应 该 退 出 。 位 0-15 都 保 留 为 标 志 向 后 兼 容 的 格 式 使 用 ; 读 者 可 以 忽 略 这 个 范 围 内 的 不 认 识 的 位 。 目 前 只 定 义 了 一 个 标 志 位 , 而 其 它 的 必 须 是 零 :

Bit 16 如 果 为

1, 那 么 在 数 据 中 包 括 了 OID; 如 果 为 0, 则 没 有

头 扩 展 范 围 长 度

32 位 整 数 , 以 字 节 计 的 头 剩 余 长 度 , 不 包 括 自 身 。 目 前 , 它 是 零 , 后 面 紧 跟 第 一 条 元 组 。 对 该 格 式 的 更 多 的 修 改 都 将 允 许 额 外 的 数 据 出 现 在 头 中 。 读 者 应 该 忽 略 任 何 它 不 知 道 该 如 何 处 理 的 头 扩 展 数 据 。 头 扩 展 数 据 是 一 个 用 来 保 留 一 个 自 定 义 的 数 据 序 列 块 用 的 。 这 个 标 志 域 无 意 告 诉 读 者 扩 展 区 的 内 容 是 什 么 。 头 扩 展 的 具 体 设 计 内 容 留 给 以 后 的 版 本 用 。 这 样 设 计 就 允 许 向 下 兼 容 头 附 加 ( 增 加 头 扩 展 块 , 或 者 设 置 低 位 序 标 志 位 ) 以 及 非 向 下 兼 容 修 改 ( 设 置 高 位 标 志 位 以 标 识 这 样 的 修 改 , 并 且 根 据 需 要 向 扩 展 区 域 增 加 支 持 数 据 ) 。

TUPLES 元 组 每 条 元 组 都 以 一 个 16 位 整 数 计 数 开 头 , 该 计 数 是 元 组 中 字 段 的 数 目 。 ( 目 前 , 在 一 个 表 里 的 每 条 元 组 都 有 相 同 的 计 数 , 但 可 能 不 会 永 远 这 样 。 ) 然 后 后 面 不 断 出 现 元 组 中 的 各 个 字 段 , 字 段 先 是 一 个 32 位 的 长 度 字 , 后 面 跟 着 那 么 长 的 字 段 数 据 。 ( 长 度 字 并 不 包 括 自 己 , 并 且 可 以 为 零 。 ) 一 个 特 例 是 : -1 表 示 一 个 NULL 字 段 值 。 在 NULL 情 况 下 , 后 面 不 会 跟 着 数 值 字 节 。 在 数 据 域 之 间 没 有 对 奇 填 充 或 者 任 何 其 它 额 外 的 数 据 。 目 前 , 一 个 COPY BINARY 文 件 里 的 所 有 数 据 值 都 假 设 是 二 进 制 格 式 的 ( 格 式 代 码 为 一 ) 。 预 计 将 来 的 扩 展 可 能 增 加 一 个 头 域 , 允 许 为 每 个 字 段 声 明 格 式 代 码 。 为 了 判 断 实 际 元 组 数 据 的 正 确 的 二 进 制 格 式 , 你 应 该 阅 读 PostgreSQL 源 代 码 , 特 别 是 该 字 段 数 据 类 型 的 *send 和 *recv 函 数 ( 典 型 的 函 数 可 以 在 源 代 码 的 src/backend/utils/adt/ 目 录 找 到 ) 。 如 果 在 文 件 中 包 括 了 OID, 那 么 该 OID 域 立 即 跟 在 字 段 计 数 字 后 面 。 它 是 一 个 普 通 的 字 段 , 只 不 过 它 没 有 包 括 在 字 段 计 数 。 但 它 包 括 长 度 字 --- 这 样 就 允 许 我 们 不 用 花 太 多 的 劲 就 可 以 处 理 4 字 节 和 8 字 节 的 OID, 并 且 如 果 某 个 家 伙 允 许 OID 是 可 选 的 话 , 那 么 还 可 以 把 OID 显 示 成 空 。

FILE TRAILER 文 件 尾 文 件 尾 包 括 保 存 着 -1 的 一 个 16 位 整 数 字 。 这 样 就 很 容 易 与 一 条 元 组 的 域 计 数 字 相 区 分 。 如 果 一 个 域 计 数 字 既 不 是 -1 也 不 是 预 期 的 字 段 的 数 目 , 那 么 读 者 应 该 报 错 。 这 样 就 提 供 了 对 丢 失 与 数 据 的 同 步 的 额 外 的 检 查 。

EXAMPLES 例 子

下 面 的 例 子 把 一 个 表 拷 贝 到 客 户 端 , 使 用 竖 直 条 ( |) 作 为 域 分 隔 符 :

COPY country TO STDOUT WITH DELIMITER ’|’; 从 一 个 Unix 文 件 中 拷 贝 数 据 到 一 个 country表 中 :

COPY country FROM ’/usr1/proj/bray/sql/country_data’; 下 面 是 一 个 可 以 从 STDIN 中 拷 贝 数 据 到 表 中 的 例 子 :

AF AFGHANISTAN
AL ALBANIA
DZ ALGERIA
ZM ZAMBIA
ZW ZIMBABWE 请 注 意 在 这 里 每 行 里 的 空 白 实 际 上 是 一 个 水 平 制 表 符 tab。 下 面 的 是 同 样 的 数 据 , 在 一 台 Linux/i586 机 器 上 以 二 进 制 形 式 输 出 。 这 些 数 据 是 用 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

COMPATIBILITY 兼 容 性

在 SQL 标 准 里 没 有 COPY 语 句 。

7.3 以 前 的 应 用 使 用 下 面 的 语 法 , 现 在 仍 然 支 持 :

COPY [ BINARY ] tablename [ WITH OIDS ]
FROM { ’filename’ | STDIN }
[ [USING] DELIMITERS ’delimiter’ ]
[ WITH NULL AS ’null string’ ]

COPY [ BINARY ] tablename [ WITH OIDS ]
TO { ’filename’ | STDOUT }
[ [USING] DELIMITERS ’delimiter’ ]
[ WITH NULL AS ’null string’ ]

译 者

Postgresql 中 文 网 站 何 伟 平 <laser [AT] pgsqldb.org>

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh