PostgreSQL使用Binary Copy时如何忽略大表中的重复记录
PostgreSQL Binary Copy批量插入忽略已存在记录的高效方案
PostgreSQL的COPY命令本身没有直接忽略重复记录的参数,但可以通过临时表+INSERT ON CONFLICT的组合实现高效批量导入,完美适配百万级数据场景:
步骤1:创建临时表(复制目标表结构)
先创建一个和ph_numbers结构完全一致的临时表,临时表仅在当前会话生效,性能开销极低:
CREATE TEMP TABLE temp_ph_numbers AS SELECT * FROM ph_numbers LIMIT 0;
步骤2:用Binary Copy将数据导入临时表
复用你原本的Binary Copy逻辑,只是把目标表换成临时表(注意修正原代码里的引号语法错误):
// 修正原代码的引号闭合问题 await connection.BeginBinaryImportAsync($"COPY temp_ph_numbers FROM STDIN (FORMAT BINARY)"); // 这里继续写入二进制数据的逻辑... await binaryImport.CompleteAsync();
步骤3:将临时表数据导入目标表并忽略重复
通过INSERT ... SELECT结合ON CONFLICT语法,指定表的唯一约束字段(假设你的唯一键是phone_number),自动忽略已存在的记录:
INSERT INTO ph_numbers SELECT * FROM temp_ph_numbers ON CONFLICT (phone_number) DO NOTHING;
关键说明
- 临时表的优势:避免直接操作大表带来的锁竞争,且数据写入临时表的速度和原
COPY几乎无差异 ON CONFLICT的效率:PostgreSQL会利用唯一索引快速判断重复,比逐条校验快几个数量级,完全适配百万级数据- 如果目标表有多个唯一约束,只需在
ON CONFLICT后指定对应的约束名或字段组合即可
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

