從外部來源上傳資料就像找夥伴一起幹大事。你一定想確定大家都帶著正確的心態來——或者說,資料格式都對。就算檔案裡有一點小錯,都可能讓你 debug 好幾個小時、查詢結果怪怪的,甚至直接把資料表搞壞。
有時候檔案裡會混進空白行、多餘的空格、重複資料,或者本來該是數字的地方卻變成文字。如果編碼又不對,資料表甚至會直接拒絕收檔案。
為了避免這種情況,最好一開始就先檢查資料正不正確——不管是在上傳前還是上傳後馬上檢查。現在我們就來看看怎麼做吧。
檢查資料結構
- 比對資料表結構和上傳的資料
第一步就是要確定資料有照你的資料表結構上傳。比如你建立了一個 students 資料表來存學生資訊:
CREATE TABLE students (
student_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
birth_date DATE,
email VARCHAR(100) UNIQUE
);
如果你已經把資料上傳到這個表,先來看看裡面有什麼:
SELECT * FROM students;
查詢結果會顯示表裡所有紀錄。如果 CSV 檔的資料結構跟資料表不一樣,你在上傳時就會看到錯誤。不過就算沒錯誤,也不代表資料就一定沒問題。
- 檢查資料型別
用 PostgreSQL 的函數來檢查欄位內容。舉例來說:
檢查空值 (NULL):
如果你的資料表有 NOT NULL 必填欄位,你要確定它們真的有填。例如:
SELECT * FROM students WHERE first_name IS NULL OR last_name IS NULL;
檢查資料格式:
有時候資料會被當成字串上傳,其實應該是日期或數字。要檢查這個,可以用 PostgreSQL 的函數,例如:
SELECT * FROM students WHERE birth_date::DATE IS NULL;
這個查詢會顯示 birth_date 欄位不能轉成 DATE 型別的紀錄。
檢查有沒有錯誤
- 找重複資料
重複紀錄超常見。假設你的資料應該用 email 當唯一值 (email)。要找重複,可以用這個查詢:
SELECT email, COUNT(*)
FROM students
GROUP BY email
HAVING COUNT(*) > 1;
這個查詢會顯示所有重複的 email,還有它們出現幾次。如果你的 email 欄位設成 UNIQUE,上傳這種資料會直接報錯。
- 檢查不正確的資料
如果你預期 birth_date 欄位只會有生日,你要確定所有值都在合理範圍。例如:
SELECT * FROM students
WHERE birth_date < '1900-01-01' OR birth_date > CURRENT_DATE;
這個查詢會顯示生日太誇張的紀錄。
處理不正確的資料
找到問題之後,就要來修正啦。來看看怎麼做。
- 刪除不正確的資料
如果發現表裡有名字是空的紀錄,可以直接刪掉:
DELETE FROM students
WHERE first_name IS NULL OR last_name IS NULL;
但刪資料要小心!有時候這些資料很重要,也許你該考慮更新而不是直接刪掉。
- 更新資料
如果你找到有缺資料的紀錄,可以根據其他來源或猜測來補。例如:
UPDATE students
SET email = 'unknown@example.com'
WHERE email IS NULL;
用資料視覺化來分析
- 用聚合函數
有時候檢查資料時,算一下聚合值很有幫助。比如想知道每年出生的學生有多少,可以這樣查:
SELECT EXTRACT(YEAR FROM birth_date) AS year, COUNT(*)
FROM students
GROUP BY year
ORDER BY year;
這個查詢會顯示每年的人數分布,也可以看出有沒有哪一年學生特別多(可能有問題)。
- 用限制條件檢查資料
確定資料有符合表裡設定的限制,比如這樣:
檢查唯一性:
SELECT DISTINCT email
FROM students;
如果唯一值的數量比總行數少——你就有重複資料啦。
檢查值的範圍:
SELECT * FROM students
WHERE LENGTH(first_name) > 50 OR LENGTH(last_name) > 50;
這可以幫你確定學生名字沒超過 50 個字元的限制。
如果一切都爛掉怎麼辦?
有時候資料爛到爆,重上傳比較快。
把表裡所有資料都刪掉:
TRUNCATE TABLE students;用 Python、Excel 或其他工具修好原始 CSV 檔。
- 再用
COPY指令重新上傳資料。
實戰應用
每次你跟外部資料打交道,資料驗證技巧都超有用。像面試時,面試官很常要你寫 SQL 查詢來檢查輸入資料品質——這很常見。在實際專案裡,情況也一樣:客戶或其他部門給的資料幾乎都會有錯,通常你就是第一個發現問題、第一個能修好的人,這樣 bug 就不會發生啦。
定期檢查資料可以讓你的資料庫一直很乾淨——這不是形式,是能幫整個團隊省下超多時間、精力和心力的真本事。所以只要你能很快看出資料有沒有問題——你就離 PostgreSQL 大師又近一步啦!
GO TO FULL VERSION