[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > 其它 > 正文
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-COPY
編譯:何偉平 laser@zhengmai.com.cn (2001-04-21 21:44:57)

COPY
拷貝
COPY  在表和文件之間拷貝數據
語法
COPY [ BINARY ] table [ WITH OIDS ]
    FROM { 'filename' | stdin }
    [ [USING] DELIMITERS 'delimiter' ]
    [ WITH NULL AS 'null string' ]
COPY [ BINARY ] table [ WITH OIDS ]
    TO { 'filename' | stdout }
    [ [USING] DELIMITERS 'delimiter' ]
    [ WITH NULL AS 'null string' ]
輸入
BINARY 
改變字段格式屬性,強制所有數據都使用二進制格式存儲和讀取. 
  
table 
現存表的名字. 
WITH OIDS 
拷貝每行的內部唯一對象標識(OID). 
filename 
輸入或輸出的Unix文件的絕對路徑(文件)名. 
stdin 
聲明輸入是來自管道還是終端. 
stdout 
聲明輸出是進入管道還是終端. 
delimiter 
一個用分隔輸入或輸出的域的分隔符. 
null print 
一個代表 NULL 值的字串。因歷史原因,缺省是“\N”(反斜槓-N)。例如,你可以自己挑一個空字串。 
注意:對拷貝入(copy in),任何匹配這個字串的字串將被存儲為 NULL 值,所以你應該確保你用的字串和拷貝出(copy out)相同。
輸出
COPY 
拷貝成功完成. 
ERROR: reason 
拷貝失敗,原因在錯誤信息裡. 

描述
COPY 在 Postgres 表和標準 Unix 文件之間交換數據.COPY 指示 Postgres 端直接從文件中讀寫數據.該文件必須為端可見,而且文件名必須從端的角度聲明.如果聲明的是 stdin 或 stdout,數據通過客戶前端流到端. 
注意
BINARY 關鍵字將強制使用二進制對象而不是文本存儲/讀取所有數據.這樣做在一定程度上比傳統的拷貝命令快,但移植性不是很好,而且生成的文件也較大,盡管這個方面與數據本身密切相關. 
缺省地,文本拷貝使用 tab ("\t")字符作為分隔符.分隔符仍然可以用關鍵字 USING DELIMITERS 改成任何其它的字符.在數據中碰巧與分隔符相同的字符將用引號引起. 

你對任何要 COPY 出來的數據必須有select權限,對任何要 COPY 入數據的表必須有inser和update權限.使用 COPY 時端同樣需要適當的對文件操作的 Unix 權限. 

關鍵字 USING DELIMITERS 聲明一個作為所有列的分隔符的字符.如果在分隔符字串裡聲明了多個字符,只使用第一個字符. 

小技巧: 不要把 COPY 和 psql 的命令\copy 混淆.
COPY 不會激活規則,也不會處理字段缺省值。不過它的確激活觸發器。 
COPY 在第一個錯誤處停下來.這些在 COPY FROM 中不應該導致問題,但在 COPY TO 時目的表會部分改變.應該在一次失敗的拷貝用 VACUUM 查詢做一些清除工作. 

因為 Postgres 端的工作目錄通常和用戶的工作目錄不一樣,本地用戶向一個文件"foo"(沒有附加的路徑信息)可能會產生不可預見的結果.這時,foo 將生成在 $PGDATA/foo. 通常,聲明拷貝文件時要加上相對端服務器的全路徑. 

作為 COPY 參數聲明的文件名必須存在與數據庫服務器可訪問的地方,不管是在本地硬盤還是在網絡文件系統上. 

如果使用了一個從一台機器到另一台機器的 TCP/IP 連接,而且聲明了目標文件,那目標文件將會寫到端運行的機器上,而不是用戶的機器上.

文件格式
文本格式
當不帶 BINARY 選項使用 COPY TO 時,生成的文件每條記錄佔據一行,每列(字段)用分隔符分開.內嵌的分隔符字符將由一個反斜槓("\")開頭.字段值本身是由與每個字段類型相關的輸出函數生成的字符串.某一類型的輸出函數本身不應該生成反斜槓;這個任務由 COPY 本身完成. 
每個記錄的實際格式是 

...
如果聲明了 WITH OIDST,它將被放在每行的開頭. 
如果 COPY 將它的輸出輸出到標準輸出而不是一個文件,在拷貝結束時,它將在一個新行上輸出一個反斜槓("\")和一個句點("."),最是一個換行符做為文件結束符.類似,如果 COPY 從標準輸入讀入數據,它將把一行開頭的由一個反斜槓("\")和一個句點(".")和一個換行符組成的這三個連續字符作為文件結束符.不過,如果在這三個字符組合之前碰到一個真的EOF(文件結束符) COPY 將結束 terminate (接著就是端自身). 

斜槓有其他的含義.NULL屬性輸出為"\N". 一個反斜槓字符輸出成兩個連續的反斜槓("\\")一個tab字符用一個反斜槓面跟一個tab代表. 一個新行字符用一個反斜槓和一個新行代表.當裝載不是由Postgres 生成的文件時,你需要將反斜槓字符 ("\")轉換成雙反斜槓("\\")以保証正確裝載.?/div> 

二進制格式
當使用 COPY BINARY,文件的頭四個字節將是文件中記錄的個數.如果數值是零, COPY BINARY 命令將一直讀到文件尾.否則,它將在達到個數時停止讀取.文件中剩余的數據將被忽略. 
文件中每一實例的格式如下表.要注意本格式一定要 完全 符合.無符號的四字節整數數量在下表中稱做 uint32 . 

表 19-1. 二進制拷貝文件的內容 
   
 文件開始 
uint32 記錄個數 
每條記錄 
uint32 記錄數據總長 
uint32 oid (如果聲明了) 
uint32 null 字段的個數 
[uint32,...,uint32] 字段個數(attribute numbers of attributes), 從0開始 
- <字段數據> 

二進制數據的對齊
在Sun-3s,2-字節字段以2-字節為界對齊,而所有整數字段以4-字節為界對齊.字符字段以1-字節為界對齊.在大部分其他機器上,所有大1字節的整數是按照4-字節為邊界對齊的.注意,變長字段由字段長度在埃皇櫓皇羌虻氖樵乩嘈偷牧鰨?/div> 
用法
下面的例子將一個表拷貝到標準輸出,使用豎直條("|")作為域分隔符: 
COPY country TO stdout USING DELIMITERS '|';
從一個 Unix 文件中拷貝數據到表 "country": 
COPY country FROM '/usr1/proj/bray/sql/country_data';
這裡是一些可以從標準輸入 stdin 輸入的數據的例子(所以在最有結束符): 
  
   AF      AFGHANISTAN
   AL      ALBANIA
   DZ      ALGERIA
   ...
   ZM      ZAMBIA
   ZW      ZIMBABWE
   \.
同樣的數據,輸出到一個Linux/i586機器的二進制文件中去.數據是用 Unix 應用 od -c 顯示的.表裡有三個域;第一個是char(2) 第二個是 text.所有記錄在第三字段有空(null)值.注意 char(2) 字段是如何用空(null)補齊成四個字節的以及text字段是如何前面補長度的: 
   355  \0  \0  \0 027  \0  \0  \0 001  \0  \0  \0 002  \0  \0  \0
   006  \0  \0  \0   A   F  \0  \0 017  \0  \0  \0   A   F   G   H
     A   N   I   S   T   A   N 023  \0  \0  \0 001  \0  \0  \0 002
    \0  \0  \0 006  \0  \0  \0   A   L  \0  \0  \v  \0  \0  \0   A
     L   B   A   N   I   A 023  \0  \0  \0 001  \0  \0  \0 002  \0
    \0  \0 006  \0  \0  \0   D   Z  \0  \0  \v  \0  \0  \0   A   L
     G   E   R   I   A
   ...              \n  \0  \0  \0   Z   A   M   B   I   A 024  \0
    \0  \0 001  \0  \0  \0 002  \0  \0  \0 006  \0  \0  \0   Z   W
    \0  \0  \f  \0  \0  \0   Z   I   M   B   A   B   W   E
兼容性
SQL92
在SQL92裡沒有 COPY 語句. 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-VACUUM (2001-04-21 22:16:33)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-UPDATE (2001-04-21 22:16:12)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-UNLISTEN (2001-04-21 22:15:44)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-TRUNCATE (2001-04-21 22:15:24)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SHOW (2001-04-21 22:15:01)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SET (2001-04-21 22:14:42)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SELECT INTO (2001-04-21 22:14:19)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SELECT (2001-04-21 22:14:01)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-ROLLBACK (2001-04-21 22:13:41)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-REVOKE (2001-04-21 22:13:18)

===更多相關===
 

★  樊強制作 歡迎分享  ★