2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

COPY

COPY — 在檔案和表之間複製資料

概要

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]
    [ WHERE condition ]

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

where option can be one of:

    FORMAT format_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_ERROR error_action
    REJECT_LIMIT maxerror
    ENCODING 'encoding_name'
    LOG_VERBOSITY verbosity

描述

COPY 用於在 PostgreSQL 表和標準檔案系統檔案之間移動資料。COPY TO 將表的內容複製一個檔案,而 COPY FROM 將資料一個檔案複製到表中(將資料追加到表中已有的任何資料之後)。COPY TO 也可以複製 SELECT 查詢的結果。

如果指定了列列表,COPY TO 將只把指定列中的資料複製到檔案。對於 COPY FROM,檔案中的每個欄位將按順序插入到指定的列中。在 COPY FROM 列列表中未指定的表列將接收其預設值。

COPY 加上檔名會指示 PostgreSQL 伺服器直接讀寫檔案。該檔案必須是 PostgreSQL 使用者(伺服器執行的使用者 ID)可訪問的,並且檔名必須從伺服器的角度指定。當指定 PROGRAM 時,伺服器會執行給定的命令,並從程式的標準輸出讀取資料,或寫入程式的標準輸入。該命令必須從伺服器的角度指定,並且是 PostgreSQL 使用者可執行的。當指定 STDINSTDOUT 時,資料透過客戶端和伺服器之間的連線傳輸。

每個執行 COPY 的後端都會在 pg_stat_progress_copy 檢視中報告其進度。有關詳細資訊,請參閱 第 27.4.3 節

預設情況下,COPY 在處理過程中遇到錯誤時會失敗。對於希望嘗試載入整個檔案的用例,可以使用 ON_ERROR 子句來指定其他行為。

引數

table_name

現有表的名稱(可選模式限定)。

column_name

要複製的可選列列表。如果未指定列列表,則將複製表的所有列(不包括生成列)。

query

一個 SELECTVALUESINSERTUPDATEDELETEMERGE 命令,其結果將要被複制。請注意,查詢必須用括號括起來。

對於 INSERTUPDATEDELETEMERGE 查詢,必須提供 RETURNING 子句,並且目標關係不得有條件規則、ALSO 規則或展開為多個語句的 INSTEAD 規則。

filename

輸入或輸出檔案的路徑名。輸入檔名可以是絕對路徑或相對路徑,但輸出檔名必須是絕對路徑。Windows 使用者可能需要使用 E'' 字串並雙寫路徑名中使用的反斜槓。

PROGRAM

要執行的命令。在 COPY FROM 中,輸入從命令的標準輸出讀取;在 COPY TO 中,輸出寫入命令的標準輸入。

請注意,該命令由 shell 呼叫,因此如果您需要傳遞來自不受信任源的任何引數,您必須小心剝離或轉義任何可能對 shell 具有特殊含義的特殊字元。出於安全原因,最好使用固定的命令字串,或者至少避免在其中包含任何使用者輸入。

STDIN

指定輸入來自客戶端應用程式。

STDOUT

指定輸出到客戶端應用程式。

boolean

指定是否應開啟或關閉選定的選項。您可以編寫 TRUEON1 來啟用選項,編寫 FALSEOFF0 來停用選項。boolean 值也可以省略,在這種情況下假定為 TRUE

FORMAT

選擇要讀取或寫入的資料格式:textcsv(逗號分隔值)或 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

不將指定列的值與 null 字串進行匹配。在預設情況下,null 字串為空,這意味著即使未引用,空值也將被讀取為零長度字串而不是 null。如果指定了 *,則該選項將應用於所有列。此選項僅允許在 COPY FROM 中使用,並且僅在使用 CSV 格式時使用。

FORCE_NULL

將指定列的值與 null 字串進行匹配,即使它已被引用,並且如果找到匹配項,則將值設定為 NULL。在預設情況下,null 字串為空,這意味著將帶引號的空字串轉換為 NULL。如果指定了 *,則該選項將應用於所有列。此選項僅允許在 COPY FROM 中使用,並且僅在使用 CSV 格式時使用。

ON_ERROR

指定在將列的輸入值轉換為其資料型別時遇到錯誤時如何處理。值為 stoperror_action 表示使命令失敗,而 ignore 表示丟棄輸入行並繼續處理下一行。預設值為 stop

FORMATtextcsv 時,ignore 選項僅適用於 COPY FROM

如果在 COPY FROM 結束時至少有一行被丟棄,則會發出一個包含被丟棄行數的 NOTICE 訊息。當 LOG_VERBOSITY 選項設定為 verbose 時,對於每一行被丟棄的行,都會發出一個包含輸入檔案行和輸入轉換失敗的列名的 NOTICE 訊息。當設定為 silent 時,不會發出有關被丟棄行的訊息。

REJECT_LIMIT

ON_ERROR 設定為 ignore 時,指定在將列的輸入值轉換為其資料型別時允許的最大錯誤數。如果輸入引起的錯誤超過指定值,即使 ON_ERROR 設定為 ignoreCOPY 命令也會失敗。此子句必須與 ON_ERROR=ignore 一起使用,並且 maxerror 必須是正整數 bigint。如果未指定,ON_ERROR=ignore 允許無限數量的錯誤,這意味著 COPY 將跳過所有錯誤資料。

ENCODING

指定檔案以 encoding_name 編碼。如果省略此選項,則使用當前的客戶端編碼。有關更多詳細資訊,請參閱下面的註釋。

LOG_VERBOSITY

指定 COPY 命令發出的訊息量:defaultverbosesilent。如果指定了 verbose,則在處理過程中會發出額外的訊息。silent 會抑制 verbose 和 default 訊息。

這目前在 COPY FROM 命令中使用,當 ON_ERROR 選項設定為 ignore 時。

WHERE

可選的 WHERE 子句具有通用形式

WHERE condition

其中 condition 是任何計算結果為 boolean 型別的表示式。任何不滿足此條件的行都不會被插入到表中。如果實際行值被替換為任何變數引用時,條件計算結果為 true,則該行滿足條件。

目前,WHERE 表示式中不允許子查詢,並且評估看不到 COPY 本身所做的任何更改(當表示式包含對 VOLATILE 函式的呼叫時,這很重要)。

輸出

成功完成後,COPY 命令將返回一個形式為

COPY count

的命令標籤。count 是複製的行數。

注意

psql 僅在命令不是 COPY ... TO STDOUT 或等效的 psql 元命令 \copy ... to stdout 時列印此命令標籤。這是為了避免將命令標籤與剛剛列印的資料混淆。

註釋

COPY TO 可與普通表和已填充的物化檢視一起使用。例如,COPY table TO 複製的行與 SELECT * FROM ONLY table 相同。但是,它不直接支援其他關係型別,例如分割槽表、繼承子表或檢視。要複製這些關係中的所有行,請使用 COPY (SELECT * FROM table) TO

COPY FROM 可與普通表、外部表、分割槽表或具有 INSTEAD OF INSERT 觸發器的檢視一起使用。

您必須擁有對 COPY TO 讀取的表值的 select 許可權,以及對 COPY FROM 插入值的表的 insert 許可權。對命令中列出的列擁有列許可權就足夠了。

如果表啟用了行級安全,相關的 SELECT 策略將適用於 COPY table TO 語句。目前,對於具有行級安全功能的表,不支援 COPY FROM。請改用等效的 INSERT 語句。

COPY 命令中命名的檔案由伺服器直接讀取或寫入,而不是由客戶端應用程式讀取或寫入。因此,它們必須位於資料庫伺服器計算機上或可由資料庫伺服器計算機訪問,而不是客戶端。它們必須是 PostgreSQL 使用者(伺服器執行的使用者 ID)可訪問且可讀寫的,而不是客戶端。同樣,用 PROGRAM 指定的命令由伺服器直接執行,而不是由客戶端應用程式執行,並且必須由 PostgreSQL 使用者可執行。COPY 命名檔案或命令僅允許資料庫超級使用者或被授予 pg_read_server_filespg_write_server_filespg_execute_server_program 角色之一的使用者使用,因為它允許讀取或寫入伺服器有權訪問的任何檔案或執行程式。

不要將 COPYpsql 指令 \copy 混淆。\copy 呼叫 COPY FROM STDINCOPY 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_NULLFORCE_NOT_NULL 可以同時應用於同一列。這會導致將帶引號的 null 字串轉換為 null 值,並將不帶引號的 null 字串轉換為空字串。

檔案格式

文字格式

當使用 text 格式時,讀取或寫入的資料是文字檔案,每行對應一個錶行。行中的列由分隔符字元分隔。列值本身是每個屬性的資料型別的輸出函式生成的字串,或可被輸入函式接受的字串。指定的 null 字串將用於代替 null 列。COPY FROM 如果輸入檔案中的任何行包含的列數多於或少於預期,則會引發錯誤。

資料結束可以用僅包含反斜槓點 (\.) 的行來表示。從檔案讀取時不需要結束資料標記,因為檔案結束就足夠了;在這種情況下,此規定僅為向後相容。但是,psql 使用 \. 來終止 COPY FROM STDIN 操作(即在 SQL 指令碼中讀取內聯 COPY 資料)。在這種情況下,需要此規則才能在指令碼結束前結束操作。

反斜槓字元 (\) 可用於 COPY 資料中,以引用資料字元,這些字元可能被視為行或列分隔符。特別是,以下字元必須在它們作為列值的一部分出現時前面加上反斜槓:反斜槓本身、換行符、回車符和當前分隔符字元。

COPY TO 傳送指定的 null 字串而不新增任何反斜槓;相反,COPY FROM 在刪除反斜槓之前匹配輸入和 null 字串。因此,像 \N 這樣的 null 字串不能與實際資料值 \N 混淆(後者將被表示為 \\N)。

COPY FROM 識別以下反斜槓序列:

序列 表示
\b 退格符(ASCII 8)
\f 換頁符(ASCII 12)
\n 換行符(ASCII 10)
\r 回車符(ASCII 13)
\t 製表符(ASCII 9)
\v 垂直製表符(ASCII 11)
\digits 反斜槓後跟一個到三個八進位制數字表示具有該數字程式碼的位元組
\xdigits 反斜槓 x 後跟一個或兩個十六進位制數字表示具有該數字程式碼的位元組

目前,COPY TO 從不發出八進位制或十六進位制數字反斜槓序列,但它確實使用了上面列出的其他序列來表示這些控制字元。

表中未提及的任何其他反斜槓字元將被視為代表自身。但是,請注意不要不必要地新增反斜槓,因為這可能會意外地產生一個匹配結束資料標記 (\.) 或 null 字串 (\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 格式

此格式選項用於匯入和匯出許多其他程式(如電子表格)使用的逗號分隔值 (CSV) 檔案格式。它不使用 PostgreSQL 標準文字格式中的轉義規則,而是生成並識別常見的 CSV 轉義機制。

每個記錄中的值由 DELIMITER 字元分隔。如果值包含分隔符字元、QUOTE 字元、NULL 字串、回車符或換行符,則整個值將以 QUOTE 字元為字首和字尾,並且值中任何 QUOTE 字元或 ESCAPE 字元的出現都將以跳脫字元作為字首。您還可以使用 FORCE_QUOTE 在輸出特定列中的非 NULL 值時強制使用引號。

CSV 格式沒有標準方法來區分 NULL 值和空字串。PostgreSQLCOPY 透過引用來處理此問題。 NULL 輸出為 NULL 引數字串並且不被引用,而與 NULL 引數字串匹配的非 NULL 值將被引用。例如,在預設設定下,NULL 被寫成一個不帶引號的空字串,而空字串資料值被寫成雙引號 ("")。讀取值遵循類似的規則。您可以使用 FORCE_NOT_NULL 來阻止對特定列進行 NULL 輸入比較。您也可以使用 FORCE_NULL 將帶引號的 null 字串資料值轉換為 NULL

由於反斜槓在 CSV 格式中不是特殊字元,因此在文字模式中使用的結束資料標記 (\.) 在讀取 CSV 資料時通常不會被特殊處理。一個例外是,psql 將在僅包含 \. 的行處終止 COPY FROM STDIN 操作(即在 SQL 指令碼中讀取內聯 COPY 資料),無論是在文字模式還是 CSV 模式下。

注意

v18 之前的 PostgreSQL 版本總是將不帶引號的 \. 識別為結束資料標記,即使是從單獨的檔案讀取。為了與舊版本相容,COPY TO 將對行中單獨的 \. 進行引用,儘管這已不再是必需的。

注意

CSV 格式中,所有字元都是有意義的。由空格包圍的帶引號的值,或除 DELIMITER 之外的任何字元,都將包含這些字元。這可能會導致錯誤,如果您從一個系統匯入資料,該系統會在 CSV 行的末尾填充空格以達到某個固定寬度。如果出現這種情況,您可能需要在將資料匯入 PostgreSQL 之前,對 CSV 檔案進行預處理以刪除尾隨空格。

注意

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 保留用於指示向後相容的格式問題;如果讀取器發現此範圍內的任何意外設定的位,它應該直接忽略。目前只有一個標誌位已定義,其餘必須為零

位 16

如果為 1,則 OID 包含在資料中;如果為 0,則不包含。Oid 系統列在 PostgreSQL 中已不再支援,但格式中仍然包含該指示符。

頭部擴充套件區域長度

32 位整數,表示頭部其餘部分的長度(位元組),不包括自身。目前,此長度為零,第一個元組緊隨其後。未來對格式的更改可能允許在頭部存在額外資料。讀取器應靜默跳過任何它不知道如何處理的頭部擴充套件資料。

頭部擴充套件區域設想包含一系列自標識塊。標誌欄位不用於告知讀取器擴充套件區域中有什麼。頭部擴充套件內容的具體設計留待以後釋出。

此設計允許向後相容的頭部新增(新增頭部擴充套件塊或設定低位標誌位)和非向後相容的更改(設定高位標誌位以指示此類更改,並在需要時向擴充套件區域新增支援資料)。

元組

每個元組以一個 16 位整數開頭,表示元組中的欄位數。(目前,表中的所有元組都將具有相同的計數,但這可能不總是如此。)然後,為元組中的每個欄位重複一個 32 位長度字,後跟該數量的欄位資料位元組。(長度字不包含它本身,並且可以為零。)-1 表示 NULL 欄位值,這是一個特例。在 NULL 的情況下,後面沒有值位元組。

欄位之間沒有對齊填充或其他額外資料。

目前,二進位制格式檔案中的所有資料值都被假定為二進位制格式(格式程式碼為一)。預計未來的擴充套件可能會新增一個頭部欄位,允許指定每列的格式程式碼。

要確定實際元組資料的適當二進位制格式,您應該查閱 PostgreSQL 原始碼,特別是每個資料型別的 *send*recv 函式(通常這些函式位於原始碼分發版的 src/backend/utils/adt/ 目錄中)。

如果 OID 包含在檔案中,OID 欄位緊隨欄位計數詞之後。它是一個普通欄位,只是它不包含在欄位計數中。請注意, oid 系統列在當前版本的 PostgreSQL 中不受支援。

檔案尾

檔案尾包含一個 16 位整數字,其中包含 -1。這很容易與元組的欄位計數字區分開。

如果欄位計數詞既不是 -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。所有行在第三列中都有一個 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

相容性

SQL 標準中沒有 COPY 語句。

PostgreSQL 版本 9.0 之前使用了以下語法,並且仍然支援

COPY table_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 NULL column_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 [, ...] | * } ] ] ]

請注意,在此語法中,BINARYCSV 被視為獨立的關鍵字,而不是 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' ]

另請參閱

第 27.4.3 節

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。