PostgreSQL:如何仅恢复目标数据库中不存在的数据?
解决PostgreSQL恢复时唯一约束冲突的方案
当恢复数据遇到唯一约束冲突,仅导入目标库不存在的数据,可通过以下两种方案实现:
方案一:临时表中转导入
这是最稳妥的方式,通过临时表先接收导出数据,再用PostgreSQL的ON CONFLICT语法跳过冲突行:
- 在目标库创建临时表,结构与
runtime.batches完全一致:
CREATE TEMP TABLE temp_batches AS SELECT * FROM runtime.batches LIMIT 0;
- 修改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,执行完导入后保持会话不关闭
- 将临时表数据导入目标表,跳过唯一约束冲突的行:
假设唯一约束列是batch_id(替换为实际的唯一约束列名,多列的话用逗号分隔):
INSERT INTO runtime.batches SELECT * FROM temp_batches ON CONFLICT (batch_id) DO NOTHING;
方案二:导出为SQL脚本并修改插入逻辑
将数据导出为明文SQL,修改INSERT语句添加冲突处理逻辑:
- 修改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"
- 编辑SQL脚本,在每个
INSERT INTO runtime.batches (...) VALUES (...);语句末尾添加冲突处理:
例如:
INSERT INTO runtime.batches (col1, col2, batch_id) VALUES ('val1', 'val2', '123') ON CONFLICT (batch_id) DO NOTHING;
- 执行修改后的SQL脚本到目标库即可完成导入。
内容的提问来源于stack exchange,提问作者franzi fsl
相关产品推荐
相关产品推荐

