You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:14:52