CodeGym /课程 /SQL SELF /使用 COPY 命令从 CSV 文件导入数据

使用 COPY 命令从 CSV 文件导入数据

SQL SELF
第 23 级, 课程 1
可用

嗨,朋友们!想象一下你有个 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 文件符合这些要求:

  1. 表头行里没有隐藏字符或空格。
  2. 用对编码:PostgreSQL 推荐用 UTF-8。
  3. 分隔符和 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 真的能让你轻松搞定大批量数据。

2
任务
SQL SELF, 第 23 级, 课程 1
已锁定
使用 `COPY` 命令导入数据到表中
使用 `COPY` 命令导入数据到表中
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION