PostgreSQL,使用 pg_restore 更新现有行
有时我需要同步两个 PostgreSQL 数据库(一些表从开发数据库到生产数据库)。
所以我想出了这个脚本:
[...]
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \
pg_restore -a -U user2 -d dbname2
[...]
问题是这仅适用于新添加的行。当我编辑非 PK 列时,出现约束错误并且行未更新。对于每个转储的行,我需要检查它是否存在于目标数据库中(通过 PK),如果存在,则在 INSERT/COPY 之前将其删除。
感谢您的建议。
I need to sync two PostgreSQL databases (some tables from development db to production db) sometimes.
So I came up with this script:
[...]
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \
pg_restore -a -U user2 -d dbname2
[...]
The problem is that this works just for newly added rows. When I edit non-PK column I get constraint error and row isn't updated. For each dumped row I need to check if it exists in destination database (by PK) and if so delete it before INSERT/COPY.
Thanks for advices.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这样做:
您将在第二个
\i
上收到很多重复的主键错误,但它会执行您想要的操作: devel 中的所有行都将被更新,不在 devel 中的所有行都不会更新被更新或删除。如果您有对 table1 的任何引用,那么您必须在导入之前删除它们并在导入后重新创建它们。特别是检查
删除级联
、set null
或set default
对table1的引用 - 如果你有这些,你会丢失其他表中的数据。Do this:
You'll get a lot of duplicate primary key errors on second
\i
, but it'll do what you want: all rows from devel will be updated, all rows not in devel will not be updated nor deleted.If you have any references to table1 then you'll have to drop them before and recreate them after importing. Especially check for
on delete cascade
,set null
orset default
references to table1 - you'd loose data in other tables if you have those.