最近有需要對資料進行遷移的需求,由於postgres效能的關係,單錶3000w的資料量查詢起來有一些慢,需要對大表進行切割,拆成若干個子表,涉及到原有資料要遷移到子表的需求。起初的想法是使用儲存過程,使用select insert方式進行,但是資料量大的時候耗時有點久,於是需要想別的辦法,就發現了postgres本身支援的copy命令。
copy在postgresql表和檔案之間交換資料。 copy to把乙個表的所有內容都拷貝到乙個檔案,而copy from從乙個檔案裡拷貝資料到乙個表裡(把資料附加到表中已經存在的內容裡)。 copy to還能拷貝select查詢的結果。
如果宣告了乙個字段列表,copy將只在檔案和表之間拷貝已宣告欄位的資料。 如果表中有任何不在字段列表裡的字段,那麼copy from將為那些字段插入預設值。
帶檔名的copy指示postgresql伺服器直接從檔案中讀寫資料。 如果宣告了檔名,那麼伺服器必須可以訪問該檔案,而且檔名必須從伺服器的角度宣告。 如果使用了program選項,則伺服器會從指定的這個程式進行輸入或是寫入該程式作為輸出。 如果使用了stdin 或stdout選項,那麼資料將通過客戶端和伺服器之間的連線來傳輸。
常用引數說明:
table_name
現存表的名字(可以有模式修飾)
column_name
可選的待拷貝字段列表。如果沒有宣告字段列表,那麼將使用所有字段
query
乙個必須用圓括弧包圍的select或values命令,其結果將被拷貝
filename
輸入或輸出檔案的路徑名。輸入檔名可以是絕對或是相對的路徑,但輸出檔名必須是絕對路徑。 windows使用者可能需要使用e」字串和雙反斜線作為路徑名稱
program
需執行的程式名。在copy from命令中,輸入是從程式的標準輸出中讀取,而在copy to中,命令的輸出會作為程式的標準輸入。
注意,程式一般是在命令列介面下執行,當使用者需要傳遞一些變數給程式時,如果這些變數的**不是可靠的,使用者必須小心過濾處理那些對命令列介面來說是有特殊意義的字元。 基於安全的原因,最好是使用固定的命令字串,或者至少是應避免直接使用使用者輸入(應先過濾特殊字元)
stdout
宣告輸入將寫入客戶端應用
format
選擇被讀或者寫的資料格式:text、csv(逗號分隔值),或者binary。 預設是text
命令:
copy
to [ [ with ] ( option [, ...] ) ]
copy to的匯出速度非常之快,經測試10w的資料量只需要3秒左右的時間
示例:
copy user to '/tmp/data/test.csv' with csv;
也可以匯出指定的屬性:
copy user(name,password) to '/tmp/data/test.csv' with csv;
也可以使用select 語句:
copy (select * from user) to '/tmp/data/test.csv' with csv;
也可以指定要匯出哪些字段:
copy (select name,age from user) to '/tmp/data/test.csv' with csv header;
命令:
copy table_name [ ( column_name [, ...] ) ]
from
[ [ with ] ( option [, ...] ) ]
示例:
copy user_1 from '/tmp/data/test.csv' with csv;
匯入命令基本與匯出一樣,只是將to 改為 from
如果匯出的時候,指定了header屬性,那麼在匯入的時候,也需要指定:
copy user_1(name, age) from '/tmp/data/test.csv' with csv header;
error: must be superuser to copy to or from a file
hint: anyone can copy to stdout or from stdin. psql's \copy command also works for anyone.
普通使用者進行執行,需要在copy前面加入 「\」,即 \copy即可
第二點:
如果匯出的字段,有integer型別,直接匯出,再匯入的話,會有問題,解決辦法是需要在匯出的時候,進行處理:
\copy ( select coalesce(integer_array, '{}')::integer as integer_array from table ) to '/tmp/data.csv' with csv header;
postgres copy語句的使用
工作中,我們經常需要將一張表裡面的資料複製到另外一張表。當然,pg中可以利用pg dump和pg restore來做備份與恢復。但是copy同樣可以做這件事,並且copy用法還比較靈活,可以指定複製內容等。下面簡單介紹一下 條件 使用copy做複製與黏貼時需要在超級使用者下,否則會報許可權錯誤。複製...
COPY命令 為PostgreSQL批量匯入資料
任務 將excel表中的資料匯入到postgresql資料庫的某張表中。工具 postgresql客戶端pgadmin。步驟 1.將excel 字段,按照postgresql 資料庫中表的字段順序來整理資料,並儲存為csv檔案。2.用記事本開啟csv檔案,另存為utf 8格式。copy testda...
COPY命令 為PostgreSQL批量匯入資料
任務 將excel表中的資料匯入到postgresql資料庫的某張表中。工具 postgresql客戶端pgadmin。步驟 1.將excel 字段,按照 postgresql 資料庫中 表的字段順序 來整理資料,並儲存為 csv檔案。2.用記事本開啟csv檔案,另存為 utf 8 格式。3.使用p...