为了从转储中恢复数据库,我想暂时禁用数据库的所有表中的所有约束,我清空了哪些内容(postregsql 8.3)。
是否有一种安全的方法可以修改pg_constraint表中容易绕过约束的字段?
当我查看文档pg_constraint时,我不这么认为。
是否可以删除pg_constraint表内容,然后再次重新填充?
如果没有,人们如何使用充满约束和外键的表来恢复/复制数据库? (我的目标数据库具有架构,但所有列都是空的。)
编辑:虽然Erwin Brandstetter的回答是对我的确切问题的良好答案(明智的警告)...解决我在恢复过程中避免外键错误的一般问题是使用旗帜 - 使用pg_restore时的--disable-triggers。
最后,我的两行命令现在是:
pg_dump.exe -h %ipAddress% -p 5432 -U postgres -F c -a -v -f %file% mydb
pg_restore.exe -h localhost -p 5432 -U postgres -d mydb -v %file% --disable-triggers
它运作正常。
答案 0 :(得分:5)
你可以......
ALTER TABLE tbl DISABLE TRIGGER ALL;
这会永久禁用表格的所有触发器。所以不要忘记以后运行:
ALTER TABLE tbl ENABLE TRIGGER ALL;
你可以......
SET CONSTRAINTS ALL DEFERRED;
这使得所有可延迟约束等到事务结束 -> 8.3 manual
除非您是黑客并确切知道自己在做什么,否则您应该永远手动修补系统目录中的表。凡人应该专门使用DDL命令来影响系统目录。
答案 1 :(得分:3)
如果你的约束是DEFERRABLE
,那么你可以这样做:
SET CONSTRAINTS DEFERRED
然而,这只是在下一个COMMIT
上移动约束检查 - 换句话说就是每次交易。
通常,对于移动数据,请部署某种backup策略。