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