使用 COPY 指令從 CSV 檔案匯入資料
嗨,各位!想像一下你有一個 Excel 表格有 10,000 行,老闆突然說:「把這個丟進資料庫吧!」 嗯...如果你打算手動一行行插入,嗯...你大概不只需要 SQL 技能,還需要放個長假。😅
幸好 PostgreSQL 有個像瞬間移動一樣的指令,能把 CSV 直接丟進資料庫——就是 COPY。它可以瞬間、大量、沒什麼廢話地載入資料。今天我們就來搞懂 COPY 怎麼用、資料要怎麼準備、還有遇到「漂浮逗號」或奇怪符號時怎麼辦。走起!
COPY 指令基礎
COPY 是 PostgreSQL 的一個指令,可以在資料表和檔案系統之間搬資料。這對大量匯入或匯出資料超級有用。
COPY 匯入資料到資料表的語法範例:
COPY table_name FROM 'path/to/your/file.csv' DELIMITER ',' CSV HEADER;
主要參數:
FROM 'path/to/your/file.csv':指定你的 CSV 檔案路徑。DELIMITER ',':指定分隔符號(這裡是逗號)。CSV HEADER:表示 CSV 檔案有標題列(第一行是欄位名稱)。
COPY 是直接在伺服器端執行的,處理大量資料時速度超快。
COPY 跟 \COPY 的差別
有時你會搞混 COPY 跟 \COPY。
COPY:在伺服器端執行。用來載入伺服器上的檔案。\COPY:這是psql客戶端的指令。可以從你本機電腦載入資料。
如果你在自己電腦上操作,通常會用 \COPY。這個我們等等再聊。
COPY 實戰範例
直接來個例子,實際操作一下比較有感。
步驟 1:準備資料表
假設我們要建一個存學生資訊的資料表:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
date_of_birth DATE,
grade FLOAT
);
步驟 2:準備 CSV 檔案
你的 CSV 檔案格式要跟資料表對得上。students.csv 範例:
first_name,last_name,date_of_birth,grade
John,Doe,2001-05-15,85.5
Jane,Smith,2000-12-22,90.0
Alice,Johnson,2002-03-10,78.0
Bob,Brown,2001-08-30,NULL
注意:CSV 欄位順序要跟資料表一樣,資料型態也要對(像日期要是 YYYY-MM-DD 格式)。
步驟 3:匯入資料
要把 students.csv 匯進 students 資料表,用這個指令:
COPY students (first_name, last_name, date_of_birth, grade)
FROM '/path/to/your/students.csv'
DELIMITER ','
CSV HEADER;
這裡發生了什麼?
- 我們指定資料表
students跟要匯入的欄位。 - 檔案路徑指向你的 CSV 檔案。
- 分隔符號
,表示資料用逗號分開。 CSV HEADER讓 PostgreSQL 知道第一行是欄位名稱。
結果:
執行完指令後,資料就進到資料表了,你可以馬上查查看:
SELECT * FROM students;
限制與注意事項
為了避免出錯,請確保你的 CSV 檔案符合這些條件:
- 標題列沒有隱藏符號或多餘空白。
- 用正確的編碼:PostgreSQL 通常建議用 UTF-8。
- 分隔符號要跟
DELIMITER參數一致。
用 COPY 匯入時常見錯誤:
資料結構不符。 例如你把文字塞進數字欄位:
ERROR: invalid input syntax for type numeric: "abc"
避免這種問題,記得資料型態要對。
檔案路徑錯誤。
如果檔案不在 PostgreSQL 伺服器可存取的資料夾,會出現這個錯誤:
ERROR: could not open file "/path/to/your/file.csv" for reading: Permission denied
解法就是設定好檔案權限。
怎麼檢查資料有沒有正確匯入?
匯入後,最好檢查一下有沒有成功。例如:
查總筆數:
SELECT COUNT(*) FROM students;
找空值(像 grade 欄位是 NULL):
SELECT * FROM students WHERE grade IS NULL;
COPY 實用小技巧
記錄錯誤。 想把錯誤寫到檔案,可以用 LOG ERRORS 參數。(PostgreSQL 12+)
暫時關掉索引和觸發器。
大量匯入時可以暫時關掉索引:
ALTER TABLE students DISABLE TRIGGER ALL;
用交易(transaction)。
這樣可以「原子性」匯入——要嘛全進,要嘛出錯就全部回復:
BEGIN;
COPY students FROM '/path/to/your/file.csv' CSV HEADER;
COMMIT;
實戰應用
會用 COPY 不只 DBA 需要,開發者也會超有感。像你拿到一堆外部 API 資料,先存成 CSV,再一口氣丟進 PostgreSQL,馬上可以分析。或者同事要你把舊資料庫搬到新的 PostgreSQL 系統,這時 COPY 就是救星。
CSV 檔案在實務上超常見。例如:
- 你把銷售統計匯進分析系統。
- 從外部 CRM 匯入用戶清單。
- 直接從 Excel 匯進 PostgreSQL,不用再繞一大圈。
這次就先介紹 COPY 到這裡。下次我們會聊怎麼設計資料表,讓匯入更快更穩。先別怕試試看——COPY 真的讓你處理大量資料變得超方便!
GO TO FULL VERSION