碰到个业务需求: 把一大坨csv文件原样导入PostgreSQL中, 于是速查官方文档, 手撸SQL

COPY des_table (name, age, id_no)
FROM '/path/to/src/csv' DELIMITER ',' CSV HEADER;

然而可耻报错:

ERROR: duplicate key value violates unique constraint "uq_des_table_id_no"
key (id_no)=(3.141592653) already exists.

原来是目标des_tableid_no是索引, csv文件中有重复记录, 那么问题来了, 需要把重复的去掉, 两个思路, 要么写脚本提前把csv过滤一遍, 要么直接用SQL去排除重复, 看了下文件有两百多万行, 我选择用SQL直撸

Google一番, 基本思路就是先建个临时表, 然后把记录拷过去, 然后再把临时表中的记录拷到目标table中, 利用PostgreSQL新版本的一个特性ON CONFLICT DO NOTHING即冲突啥也不做

-- 建临时表
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;