碰到个业务需求: 把一大坨csv
文件原样导入PostgreSQL
中, 于是速查官方文档, 手撸SQL
1
2
| COPY des_table (name, age, id_no)
FROM '/path/to/src/csv' DELIMITER ',' CSV HEADER;
|
然而可耻报错:
1
2
| ERROR: duplicate key value violates unique constraint "uq_des_table_id_no"
key (id_no)=(3.141592653) already exists.
|
原来是目标des_table
中id_no
是索引, csv
文件中有重复记录, 那么问题来了, 需要把重复的去掉, 两个思路, 要么写脚本提前把csv
过滤一遍, 要么直接用SQL
去排除重复, 看了下文件有两百多万行, 我选择用SQL
直撸
Google一番, 基本思路就是先建个临时表, 然后把记录拷过去, 然后再把临时表中的记录拷到目标table
中, 利用PostgreSQL
新版本的一个特性ON CONFLICT DO NOTHING
即冲突啥也不做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| -- 建临时表
CREATE TEMP TABLE tmp_table
AS
SELECT *
FROM des_table
WITH NO DATA;
-- 数据导入临时表
COPY tmp_table (name, age, id_no)
FROM '/path/to/src/csv' DELIMITER ',' CSV HEADER;
-- 从临时表导入数据
INSERT INTO des_table (name, age, id_no)
SELECT name, age, id_no
FROM tmp_table
ON CONFLICT DO NOTHING;
-- 导入完毕, 删掉tmp_table
DROP TABLE tmp_table;
|