有时我需要同步两个 PostgreSQL 数据库(一些表从开发数据库到生产数据库)。
所以我想到了这个脚本:
[...]
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \
pg_restore -a -U user2 -d dbname2
[...]
问题是这只适用于新添加的行。当我编辑非 PK 列时,出现约束错误并且行未更新。对于每个转储的行,我需要检查它是否存在于目标数据库中(通过 PK),如果存在,则在插入/复制之前将其删除。
感谢您的建议。
最佳答案
这样做:
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 的引用,那么您必须在导入之前删除它们并在导入之后重新创建它们。特别是检查 on delete cascade
、set null
或 set default
对 table1 的引用 - 如果有这些,您会丢失其他表中的数据。
关于sql - PostgreSQL,使用 pg_restore 更新现有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806171/