PostgreSQL,使用pg_restore更新现有行

时间:2009-11-26 23:51:05

标签: sql postgresql restore dump

我有时需要同步两个PostgreSQL数据库(从开发数据库到生产数据库的一些表)。

所以我提出了这个脚本:

[...]
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \
pg_restore -a -U user2 -d dbname2
[...]

问题是这适用于新添加的行。当我编辑非PK列时,我得到约束错误并且行未更新。对于每个转储的行,我需要检查它是否存在于目标数据库中(通过PK),如果是,则在INSERT / COPY之前将其删除。

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

这样做:

pg_dump -t table1 production_database > /tmp/old_production_database_table1.sql
pg_dump -t table1 devel_database > /tmp/devel_database_table1.sql
psql production_database
truncate table1
\i /tmp/devel_database_table1.sql
\i /tmp/old_production_database_table1.sql

你会在第二个\i上遇到很多重复的主键错误,但是它会做你想要的:来自devel的所有行都将被更新,所有不在devel中的行都不会被更新或删除

如果您对table1有任何引用,那么您必须先删除它们,然后在导入后重新创建它们。特别是检查对table1的on delete cascadeset nullset default引用 - 如果你有这些数据,你会在其他表中放松数据。