當你的資料已經在伺服器上時,你可以用 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 | 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
為了避免這種問題,請確認:
- 檔案 PostgreSQL 使用者可以讀取。通常這個使用者叫
postgres。 - 檢查檔案和所在資料夾的權限:
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 從伺服器匯入資料。把這些技巧用在你的專案裡,省時間又能提升資料庫操作效率!
GO TO FULL VERSION