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

PostgreSQL:如何仅恢复目标数据库中不存在的数据?

解决PostgreSQL恢复时唯一约束冲突的方案

当恢复数据遇到唯一约束冲突,仅导入目标库不存在的数据,可通过以下两种方案实现:

方案一:临时表中转导入

这是最稳妥的方式,通过临时表先接收导出数据,再用PostgreSQL的ON CONFLICT语法跳过冲突行:

  1. 在目标库创建临时表,结构与runtime.batches完全一致:
CREATE TEMP TABLE temp_batches AS SELECT * FROM runtime.batches LIMIT 0;
  1. 修改pg_restore命令,将数据恢复到临时表:
C:\Program Files\PostgreSQL\12\bin\pg_restore.exe --host "localhost" --port "5432" --username "postgres" --no-password --dbname "sdm_wir" --data-only --verbose --table "temp_batches" "C:\\SQL_ST~1\\pg_dump.tar"

注意:临时表属于会话级对象,无需指定schema,执行完导入后保持会话不关闭

  1. 将临时表数据导入目标表,跳过唯一约束冲突的行:
    假设唯一约束列是batch_id(替换为实际的唯一约束列名,多列的话用逗号分隔):
INSERT INTO runtime.batches
SELECT * FROM temp_batches
ON CONFLICT (batch_id) DO NOTHING;

方案二:导出为SQL脚本并修改插入逻辑

将数据导出为明文SQL,修改INSERT语句添加冲突处理逻辑:

  1. 修改pg_dump命令,导出为明文SQL格式并生成单条INSERT语句:
C:\Program Files\PostgreSQL\12\bin\pg_dump.exe --file "C:\\SQL_ST~1\\pg_dump.sql" --host "localhost" --port "5432" --username "postgres" --no-password --verbose --format=p --blobs --data-only --table "runtime.batches" --inserts "sdm_kunde"
  1. 编辑SQL脚本,在每个INSERT INTO runtime.batches (...) VALUES (...);语句末尾添加冲突处理:
    例如:
INSERT INTO runtime.batches (col1, col2, batch_id) VALUES ('val1', 'val2', '123') ON CONFLICT (batch_id) DO NOTHING;
  1. 执行修改后的SQL脚本到目标库即可完成导入。

内容的提问来源于stack exchange,提问作者franzi fsl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:58