在使用 pg_restore.exe 之前禁用约束

Ste*_*and 22 postgresql foreign-key constraint restore

当我尝试pg_restore.exe从数据库执行转储文件时,它抛出了许多错误,都是一样的:

ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName"

这显然是因为我在从转储文件中恢复它之前已经清空了数据库(这个文件来自生产数据库)......当然,如果一个引用的表是空的,那么没有外键约束就可以了...

有没有办法禁用所有表的约束和所有外键,在我调用之前pg_restore.exe,然后重新启用约束和外键。

在 SO 中,我发现了一些有趣的事情:将约束检查推迟到提交时间。但我不认为我可以在推迟约束后pg_restore.exe从内部调用psql.exe

还有这个帖子,可以追溯到 10 年前,建议删除然后重新添加约束。或者将 pg_class reltriggers 的值更改为 0 并且这对于约束也是可能的......但我担心这比良好的实践更像是黑客攻击......

您有什么建议,在这种情况下的最佳做法是什么?pg_dump.exe -clean标志一起使用会创建一个转储,在还原数据库时绕过约束检查吗?

小智 37

您是否尝试过该--disable-triggers选项pg_restore

根据文档:如果您不想在数据重新加载期间调用表上的参照完整性检查或其他触发器,请使用此选项。

请注意,这仅对--data-only还原有效,并且还需要--superuser=username传递该选项。