[PostgreSQL] 如何利用COPY指令匯出資料表到CSV檔案,並由CSV匯入至新資料表


會有這種將資料匯出、匯入的需求,通常是要複製表格資料到另一個,所以我自己也做了一些模擬,順便練習一下PostgreSQL的「COPY」指令,首先,先來看一下原本的資料表資料,資料表名稱為「DemoTable

範例說明

目的:將DemoTable資料表的資料匯出成CSV檔案,並藉由此CSV檔案將資料匯入到新表格ScoreTable

網址:PostgreSQL COPY 語法

匯出資料

在PostgreSQL中要匯出資料的話可採用COPY指令,下面就是一些COPY指令的範例和輸出結果

● 範例一:COPY DemoTable to ‘d:/demo1.csv’

將資料表匯出至D槽的demo1.csv檔案,當開啟後可以放現這樣的指令會把每一筆資料全部塞到一個儲存格中

● 範例二:COPY DemoTable to ‘d:/demo2.csv’ DELIMITER ‘,’

通常我們會希望把資料隔開,所以範例一的結果通常不是我們想要的,要隔開資料也簡單,例用「DELIMITER ‘,’」就行了,加了DELIMITER之後,最後得到的結果會變成:

● 範例三:COPY DemoTable to ‘d:/demo3.csv’ DELIMITER ‘,’ CSV HEADER

承上面的範例,雖然資料隔開了,但若也想把資料表的欄位名稱也順便匯出的話呢?再指令後面加一個「CSV HEADER」就可以搞定

匯入資料

那該怎麼匯入資料到另一個表格中呢?一樣是用COPY的指令,以下我也做了一些小測試供大家參考。

註:假設新的資料表的欄位已經建好了,而且和DemoTable的欄位是一樣的

● 範例四:COPY ScoreDemo(id, name, score, level) FROM ‘d:/demo3.csv’ WITH DELIMITER ‘,’ CSV HEADER

這是一個比較完整的指令,從剛剛範例三匯出資料的demo3.csv中(有含欄位名稱),全部依新的資料表名稱欄位順序來匯入,可以看到下圖的結果,是和原始資料表DemoTable一樣的

● 範例五:COPY ScoreDemo(id, level, score, name) FROM ‘d:/demo3.csv’ WITH DELIMITER ‘,’ CSV HEADER

由於欄位的name和level都是字串,所以這個範例中我把這二個欄位的順序對調來測試看看,結果可以看出,這個指令會把CSV檔中原本的name,改放到新資料表中的level了,也就是說在CSV檔案不變的情況下,欄位的順序會影響匯入的結果喔

延伸閱讀:
[筆記] MYSQL/PostgreSQL語法中的LIMIT、OFFSET用法範例說明
[MySQL/PostgreSQL] 如何利用DISTINCT/GROUP BY 解決重複資料,並傳回所有欄位