abl*_*blm 9 postgresql duplication restore
我的数据库(PostgreSQL 9.3)的一部分依赖于额外的表(例如 County、City、Town...)。我不管理这些表,它们由第三方定期更新。每次我得到一个新的完整转储,但我很难将更改推回我的数据库。
我玩过 pg_dump / restore 并遇到了一些约束问题duplicate key value violates unique constraint,cannot drop constraint ... because other objects depend on it甚至使用--disable-triggersor--clean选项。
有没有我错过的选项?我发现有一些方法可以打开/关闭约束,但我不知道这是解决这个问题的好方法还是只是一个肮脏的黑客?(我不是 DBA 专家。)老实说,我很惊讶没有简单的方法来实现这一目标。也许我已经错过了!我天真地认为我可以将 pg_restore 作为一个大事务运行并在脚本末尾检查约束。是否可以?
约束UNIQUE不是触发器。它是通过唯一索引的方式实现的。所以不能用 来关闭它--disable-triggers。
依赖于唯一约束的“其他对象”通常是外键约束。如果引用的列没有唯一(或主键)约束,这些约束就不可能存在。要启用恢复,您可以删除所有此类 fk 约束以及唯一约束。
当然,要恢复引用完整性,您必须消除违反的重复项并重新创建所有已删除的约束。如果您无法承受不一致的状态,即使是暂时的,也可以在单个(自动阻塞)事务中完成这一切。
如果您无法负担相关表上的独占锁,那么您唯一剩下的选择就是首先修复数据。不管怎样,这可能是最好的行动方案。您可以使用 将数据导入临时表COPY,删除重复项,然后INSERT导入目标表。
另一方面,如果您遇到外键缺失NOT VALID值,您可以临时使用fk 约束:
你的问题从一开始就不应该发生。如果您实际上有一个 UNIQUE 约束,则源数据库中不能有重复的值 - 除非它严重损坏。如果是这种情况,请先修复您的源数据库......
| 归档时间: |
|
| 查看次数: |
4219 次 |
| 最近记录: |