CodeGym /課程 /SQL SELF /使用 COPY 指令從 CSV 檔案匯入資料

使用 COPY 指令從 CSV 檔案匯入資料

SQL SELF
等級 23 , 課堂 1
開放

使用 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 檔案符合這些條件:

  1. 標題列沒有隱藏符號或多餘空白。
  2. 用正確的編碼:PostgreSQL 通常建議用 UTF-8。
  3. 分隔符號要跟 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 真的讓你處理大量資料變得超方便!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION