从外部来源导入数据就像叫一帮小伙伴来搞事情。你肯定想确保大家都带着对的心态来——或者说,数据格式都对。哪怕导入文件里有个小错误,都可能让你调试半天、查出来的结果不对,甚至直接把表里的数据搞坏。
有时候文件里会混进空行、多余的空格、重复,或者比如本来该是数字的地方却是文本。要是编码还不对,表可能直接拒绝接收这个文件。
为了避免这些坑,最好提前检查下数据是不是靠谱——可以在导入前,也可以刚导完就查。下面咱们就来聊聊怎么搞。
检查数据结构
- 对比表结构和导入的数据
第一步就是要确定数据和你的表结构是对得上的。比如你建了个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应该唯一。要查有没有重复,可以用这个查询:
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