嗨,朋友们!想象一下你有个 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 文件符合这些要求:
- 表头行里没有隐藏字符或空格。
- 用对编码:PostgreSQL 推荐用 UTF-8。
- 分隔符和
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
解决办法是把文件权限设置对。
怎么检查数据导入对不对?
导入后最好检查下是不是都 OK。比如:
查总行数:
SELECT COUNT(*) FROM students;
查空值(比如 grade 字段是 NULL):
SELECT * FROM students WHERE grade IS NULL;
COPY 使用小技巧
记录错误日志。 想把错误写到单独文件,可以用 LOG ERRORS 参数。(PostgreSQL 12+ 支持)
临时关掉索引和触发器。
导入大数据时可以先关掉索引:
ALTER TABLE students DISABLE TRIGGER ALL;
用事务。
这样可以“原子”导入——要么全成功,要么出错就回滚:
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 真的能让你轻松搞定大批量数据。
GO TO FULL VERSION