Provided by: manpages-zh_1.5-1_all bug

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' ] ]

DESCRIPTIONyz
       COPY  在  PostgreSQL表和標準檔案系統檔案之間交換數據。  COPY  TO  把一-
       茠磲漫狾酗漁e都拷貝到一蚗仵蛂A 而  COPY  FROM  從一蚗仵釱堳貝數據到一-
       茠薋堙]把數據附加到表中已經存在的內容裏)。

        如果聲明了一茼r段列表,COPY   將只在檔案和表之間拷貝聲明的字段的數據。
       如果表中有任何不在字段列表裏的字段,那麼           COPY            FROM
       將為那些字段插入預設C

        帶檔名的    COPY    指示    PostgreSQL    伺服器直接從檔案中讀寫數據。
       如果聲明了檔名,那麼該檔案必須為伺服器可見,而且檔名必須從伺服器的角度聲明。如果聲明的是
       STDIN 或 STDOUT,數據通過連接在客戶前端和伺服器之間流動。

PARAMETERS數
       tablename
               現存表的名字(可以有模式袡╮^。

       column
              可選的待拷貝字段列表。如果沒有聲明字段列表,那麼將使用所有字段。

       filename
               輸入或輸出檔案的絕對路徑名。

       STDIN   聲明輸入是來自客戶端應用。

       STDOUT  聲明輸入前往客戶端應用。

       BINARY                   使用二進制格式存儲和讀取,而不是以文本的方式。
              在二進制模式下,不能聲明 DELIMITERS和NULL。

       OIDS      聲明為每行拷貝內部對象標識(OID)。   (如果給那些沒有    OID
              的表聲明了 OIDS 選項,則拋出一蚇欞~。)

       delimiter
               用於在檔案中每行中分隔各茼r段的單茼r符。             預設是水-
              制表符。(tab)

       null string
               一茈N表     NULL     漲r串。預設是     \N      (反斜槓-N)。
              當然,你可以自己挑一茠臟r串。

              Note: 注意:  對於COPY FROM,任何匹配這茼r串的字串將被存儲為 NULL
              A 所以你應該確保你用的字串和COPY TO相同。

NOTES`N
       COPY 只能用於表,不能用於視圖。

       BINARY          關鍵字將強制使用二進制對象而不是文本存儲/讀取所有數據。
       這樣做在一定程度上比傳統的拷貝命令快,但二進制拷貝檔案在不同機器體系間的植性不是很好。

        你對任何nCOPY  TO   出來的數據必須有選取數據的權,對任何n  COPY   FROM
       入數據的表必須有插入權。

       COPY                                                            命令裏-
       悸瑰仵蚰眸楓O由伺服器直接讀或寫的檔案,而不是由客戶端應用讀寫。
       因此,它-
       怚眸椰鴝騧畬w伺服器上或者可以為數據庫伺服器所訪問,而不是由客戶端做這些事情。
       它怚眸楓OPostgreSQL使用者(伺服器運行的使用者
       ID)可以訪問到並且可讀或者可寫,而不是客戶端。        COPY        到一-
       茤R名檔案是只允許數據庫超級使用者進行的,因為它允許讀寫任意伺服器有權-
       訪問的檔案。

        不n混淆 COPY 和 psql 指令 \copy\copy 調用 COPY FROM STDIN 或者 COPY
       TO   STDOUT,  然後把數據抓取/存儲到一  psql  客戶端可以訪問的檔案中。
       因此,使用 \copy 的時唌A檔案訪問權是由客戶端而不是伺服器端決定的。

        我怮媊釵b  COPY  裏的檔案名字總是使用絕對路徑。  在  COPY   TO   的時-
       圇O由伺服器強制進行的,      但是對於      COPY     FROM,你的確有從一-
       蚆n明為相對路徑的檔案裏讀取的選擇。
       該路徑將解釋為相對於伺服器的工作目錄(在數據目錄裏的什麼地方),而不是客戶端的工作目錄。

       COPY FROM 會激活所有觸發器和檢查約束。不過,不會激活規則。

       COPY 在第一蚇欞~處停下來。這些在  COPY  TO中不應該導P問題,  但在  COPY
       FROM                                      時目的表會已經接收到戎的行,
       這些行將不可見或不可訪問,但是仍然會佔據磁碟空間。
       如果你碰巧是拷貝很大一塊數據檔案的話,
       積累起來,這些東西可能會佔據相當大的一部分磁碟空間。你可以調用   VACUUM
       來恢復那些磁碟空間。

FILE FORMATS式
   TEXT FORMATr式
        當不帶      BINARY      選項使用     COPY     時,     讀寫的檔案是一-
       荅瞻憒r檔,每行代表表中一茼獢C 行中的列(字段)用分隔符分開。 字段豪-
       是由與每茼r段類型相關的輸出函數生成的字符串,
       或者是輸入函數可接受的字串。   數據中使用特定的空r串表示那些為   NULL
       的字段。  如果輸入檔案的任意行包含比預期多或者少的字段,那麼  COPY FROM
       將拋出一蚇欞~。   如果聲明了   OIDS,那麼   OID   將作為第一茼r段讀寫,
       放在所有使用者字段前情C

        數據的結束可以用一茈u包含反斜扛和句點(\.)的行表示。
       如果從檔案中讀取數據,那麼數據結束的標記是不必n的,
       因為檔案結束起的作用就很好了;但是在                                3.0
       之前的客戶端協議裏,如果在客戶端應用之間拷貝數據,            那麼必須-
       n有結束標記。

        反斜扛字符(\)可以用在                                           COPY
       裏給那些會有歧義的字符進行逃逸(否則那些字符會被當做行或者字段分隔符處理)。
       特別是下悸漲r符如果是字段漱@部分時,必須前綴一茪炱蛈炕G反斜扛本-
       ,換行符,回車,以及當前分隔符。

        聲明的空字串被   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 (反斜槓,後惇O三茪K進制數A代表具有指定漲r符)
        目前,COPY  TO  將絕不會發出一茪K進制反斜扛序列,  但是它的確使用了上-
       惘C出的其它字符用於控制字符。

        絕對不n把反斜扛放在一蚍琣r符N或者句點(.)前情C
       這樣的組合將分別被誤認為是空字串(\.)  或者數據結束標記  (\N)。  另外一-
       茖S有在上悸漯矰丹C出的反斜扛字符就是它自己。

        我戔j烈建議生成   COPY  數據的應用八換行符和回車分別轉換成  \n  和  \r
       序列。        目前我怚i以用一茪炱袟b和一茼^車表示一蚍琣^車,以及用一-
       茪炱蛈版M一荋咻瘝讀磳雂@蚍痟咻瘝禳C
       不過,這樣的表示在將來的版本中預設時可能不會被接受。

       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到伺服器檔案裏;
       為了在不同孕x之間一P,COPY   TO   STDOUT   總是發送  "\n",不管伺服器-
       台是什麼。                          COPY                           FROM
       可以處理那些以回車符,或者換行符,或者回車換行符作為行結束的數據。
       為了減少在數據中出現的未逃逸的新行或者回車導-
       P的錯誤,如果輸入的行結尾不像上掖o些符號, COPY FROM 會發出警告。

   BINARY FORMATGi式
        在PostgreSQL  7.4  中的  COPY  BINARY  的檔案格式做了變化。新格式由一-
       蚗仵袤Y,零或多條元組, 以及檔案尾組成。檔案頭和數據現在是網路字節序。

   FILE HEADERY
        檔案頭由 15 茼r節的固定域組成,後掘繺菑@蚥靰曭瑰Y擴展區。 固定域是:

       SignatureW
              11-字節的序列   PGCOPY\n\377\r\n\0   ---   請注意字節零是簽名是-
              n求的一部分。                           (使用這蚚惘W是為了讓我-
              怉鈰鱈飫e易看出檔案是否已經被一茷D  8   位安全的轉換器給糟蹋了。
              這-
              蚚惘W會被行結尾轉換過濾器,刪除字節零,刪除高位,或者奇偶的改變而改變。)

       Flags fieldx域
               32   位整數掩碼表示該檔案格式的南方情C   位是從  0(LSB)到  31
              (MSB)編碼的 ---  請注意這荌鴐O以網路字節序存儲的(高位在前),
              後繼的整數都是如此。位  16  -  31 是保留用做關鍵檔案格式信息的;
              如果讀者發現一茪˙{識的位出現在這紎圍內,那麼它應該退出。     位
              0-15            都保留為標誌向後相容的格式使用;讀者可以忽略這-
              S圍內的不認識的位。目前只定義了一蚍郅x位,而其它的必須是零:

              Bit 16  如果為 1,那麼在數據中包括了 OID;如果為 0,則沒有

      YXiSTUPLES組
       每條元組都以一                  16                  位整數p數開頭,該-
       p數是元組中字段的數目。(目前,在一茠薋堛漕C條元組都有相同的-
       p數,但可能不會永遠這樣。)然後後惜_出現元組中的各茼r段,字段先是一
       32                                                      位的長度字,後-
       掘繺菬獄簹曭漲r段數據。(長度字並不包括自己,並且可以為零。)一-
       荅S例是:-1 表示一 NULL 字段C在 NULL 情況下,後惜ㄦ|跟著數r節。

       在數據域之間沒有對奇填充或者任何其它額外的數據。

       目前,一            COPY            BINARY           檔案裏的所有數據-
       ㄟ眾]是二進制格式的(格式代碼為一)。預p將來的擴展可能增加一-
       蚗Y域,允許為每茼r段聲明格式代碼。

       為了判斷實際元組數據的正確的二進制格式,你應該閱讀           PostgreSQL
       鴝l碼,特別是該字段數據類型的 *send  和  *recv  函數(典型的函數可以在-
       鴝l碼的 src/backend/utils/adt/ 目錄找到)。

       如果在檔案中包括了   OID,那麼該   OID  域立即跟在字段p數字後情C它是一-
       荋雲q的字段,只不過它沒有包括在字段p數。但它包括長度字              ---
       這樣就允許我怳ㄔ峈嶀茼h的勁就可以處理     4     字節和     8     字節的
       OID,並且如果某荇a伙允許 OID 是可選的話,那麼還可以把 OID 顯示成空。

   FILE TRAILER尾
        檔案尾包括保存著  -1  的一  16  位整數字。這樣就很容易與一條元組的域-
       p數字相區分。

        如果一荌髹數字既不是   -1   也不是預期的字段的數目,那麼讀者應該報錯。
       這樣就提供了對丟失與數據的同步的額外的檢查。

EXAMPLESl
        下悸漕狺l把一茠礅貝到客戶端, 使用豎直條(|)作為域分隔符:

       COPY country TO STDOUT WITH DELIMITER '|';

        從一 Unix 檔案中拷貝數據到一翃ountry表中:

       COPY country FROM '/usr1/proj/bray/sql/country_data';

        下惇O一茈i以從 STDIN 中拷貝數據到表中的例子:

       AF      AFGHANISTAN
       AL      ALBANIA
       DZ      ALGERIA
       ZM      ZAMBIA
       ZW      ZIMBABWE

        請注意在這裏每行裏的空白實際上是一茪竷制表符 tab。

        下悸漪O同樣的數據,在一台     Linux/i586      機器上以二進制形式輸出。
       這些數據是用  Unix  工具  od -c 過濾之後輸出的。 該表有三茼r段;第一茯O
       char(2), 第二茯O text, 第三茯Ointeger。所有的行在第三荌麭ㄛO一  null
       C

       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

COMPATIBILITYe性
        在 SQL 標準裏沒有 COPY 語句。

        7.3 以前的應用使用下悸獄y法,現在仍然支持:

       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@pgsqldb.org>