CodeGym /課程 /SQL SELF /使用 COPY 從伺服器匯入資料

使用 COPY 從伺服器匯入資料

SQL SELF
等級 23 , 課堂 4
開放

當你的資料已經在伺服器上時,你可以用 COPY 指令把它們匯進 PostgreSQL 的資料表。這在你要處理大量資料或 PostgreSQL 跑在另一台機器時特別方便。

在伺服器端執行的 COPY 指令在實際專案裡超級好用。首先,它速度很快,因為檔案已經在伺服器上,不用再透過網路傳輸。這也讓流程更安全:不用從本機複製資料,降低外洩風險。而且你可以很容易把匯入流程寫進自動化的 server script 或 background service——像是定期更新分析用的資料表時就很適合。

COPY 指令語法

COPY 指令很簡單,但有幾個重點要注意:

COPY table_name
FROM '/path/to/file.csv'
WITH (FORMAT CSV, HEADER TRUE);
  • table_name — 你想把資料匯進去的資料表名稱。
  • /path/to/file.csv — 伺服器上檔案的完整路徑。
  • WITH 選項可以設定檔案格式、有沒有表頭、分隔符號等等。

COPY 指令範例

來看個小範例。假設你要把一個有學生資料的 CSV 檔匯進 PostgreSQL。檔案在伺服器上的路徑是 /var/lib/postgresql/data/students.csv

步驟 1. 建立資料表

先確定資料庫裡有可以匯入資料的資料表:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    registration_date DATE
);

這個資料表會存學生的資料:名字、email 和註冊日期。

步驟 2. CSV 檔案

這是 /var/lib/postgresql/data/students.csv 檔案可能的內容:

id,name,email,registration_date
1,Alex Lin,alex.lin@example.com,2023-09-01
2,Maria Chi,maria.chi@example.com,2023-09-02
3,Peter Ming,peter.ming@example.com,2023-09-02

步驟 3. COPY 指令

現在我們可以用 COPY 把檔案裡的資料匯進資料表:

COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, HEADER TRUE);

這裡:

  • FORMAT CSV 告訴 PostgreSQL 這是 CSV 格式的檔案。
  • HEADER TRUE 表示檔案第一行有欄位名稱。

執行完這個指令後,檔案裡的資料就會進到 students 這個資料表。

檢查結果

匯入資料後,記得檢查一下有沒有成功:

SELECT * FROM students;

你會看到檔案裡的資料都進到你的資料表了:

id name email registration_date
1 Alex Lin alex.lin@example.com 2023-09-01
2 Maria Chi maria.chi@example.com 2023-09-02
3 Peter Ming peter.ming@example.com 2023-09-02

權限設定

PostgreSQL 要能用 COPY 指令,必須有權限讀取檔案。如果權限沒設好,你會遇到錯誤。像這樣:

ERROR:  could not open file "/var/lib/postgresql/data/students.csv" for reading: Permission denied

為了避免這種問題,請確認:

  1. 檔案 PostgreSQL 使用者可以讀取。通常這個使用者叫 postgres
  2. 檢查檔案和所在資料夾的權限:
ls -l /var/lib/postgresql/data/students.csv

如果權限不夠,可以這樣改:

chmod 644 /var/lib/postgresql/data/students.csv
chown postgres:postgres /var/lib/postgresql/data/students.csv

這裡講的是 Linux。Windows 的權限設定通常要請 Windows 管理員處理,這就不在我們課程範圍內了。

COPY 指令的限制

COPY 有幾個要注意的地方:

檔案路徑:請用絕對路徑,因為 PostgreSQL 可能不認得相對路徑。

檔案編碼:如果 CSV 檔案的編碼跟資料庫不一樣(比如 Windows-1251 而不是 UTF-8),要記得指定正確的編碼:

COPY students
FROM '/var/lib/postgresql/data/students.csv'
WITH (FORMAT CSV, ENCODING 'WIN1251', HEADER TRUE);

檔案結構錯誤:如果檔案結構跟資料表不一樣,或資料格式不對(像是把文字匯進數字欄位),匯入就會失敗。匯入前一定要檢查資料!

實務應用

COPY 從伺服器匯入資料有很多用法:

  • 資料遷移:你可以在不同伺服器或資料庫間搬大量資料。
  • 跟外部系統整合:很多系統會把資料匯出成 CSV 檔。用 COPY 可以很快把這些資料匯進 PostgreSQL。
  • 分析報表準備:自動從伺服器匯入資料可以加速分析大量資訊的流程。

常見錯誤與解法

COPY 時你可能會遇到這些錯誤:

問題:檔案無法存取

錯誤訊息:could not open file for reading: Permission denied

解法:確認檔案 PostgreSQL 使用者(postgres)有權限,並檢查權限設定。

問題:檔案格式錯誤

錯誤訊息:malformed CSV line

解法:檢查檔案有沒有空行、資料錯誤或奇怪的符號。也要確認分隔符號設定正確。

問題:資料結構不符

錯誤訊息:ERROR: invalid input syntax for type integer

解法:確認資料表的欄位跟檔案結構一致。像是數字資料要匯進數字欄位,日期要匯進 DATE 欄位。

現在你已經有所有必要的知識,可以有效率地用 COPY 從伺服器匯入資料。把這些技巧用在你的專案裡,省時間又能提升資料庫操作效率!

1
問卷/小測驗
從CSV插入資料,等級 23,課堂 4
未開放
從CSV插入資料
從CSV插入資料
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION