sql - PostgreSQL,使用 pg_restore 更新现有行

标签 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),如果存在,则在插入/复制之前将其删除。

感谢您的建议。

最佳答案

这样做:

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 cascadeset nullset default 对 table1 的引用 - 如果有这些,您会丢失其他表中的数据。

关于sql - PostgreSQL,使用 pg_restore 更新现有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1806171/

相关文章:

mysql - 在同一台服务器上运行 MySQL 和 PostgreSQL

mysql - 仅选择最近的日期

php - 处理、发送电子邮件并将表单数据插入 SQL。 PHP/MySQL 最佳实践和安全性。

sql - 具有不同行的列的计数

postgresql - 将 hasura 与 Google Cloud Run 和 Google Cloud SQL 结合使用

sql - 将 postgresql 数组解包成行

stored-procedures - MySql 恢复问题 :Stored procedure not Restored

tensorflow cifar10 从检查点文件恢复训练

mysql - php/mysql - 根据比赛结果(进球)进行计算

Android,从其他 fragment 返回的空 ListView