使用Postgres 10.6
问题:
ON DELETE CASCADE ON UPDATE CASCADE
pg_restore
已完成到一个空白数据库,该数据库不再具有外键pg_dump
的新数据库,然后删除数据库pg_restore
上另一个具有外键约束的数据库中,数据以无效状态导入,并破坏了新数据库。我想做的是:每隔几个小时(或每天一次,取决于查询需要多长时间),就是要验证所有具有外键的表中的所有数据都是有效的。
我已阅读有关ALTER TABLE ... VALIDATE CONSTRAINT ...
的信息,但这不能解决我的问题,因为该数据当前未标记为NOT VALID
。我知道可以做这样的声明:
DELETE FROM a WHERE a.b_id NOT IN ( SELECT b.id )
但是,我有144个带有外键的表,所以这很繁琐。我可能也不想立即删除数据,而是记录问题并通知用户即将发生的更正。
当然,我想知道原始损坏是如何发生的,并防止这种情况的发生;但是目前,我只是想阻止它传播。
示例表:
CREATE TABLE dependencies (
...
from_task int references tasks(id) ON DELETE CASCADE ON UPDATE CASCADE NOT NULL,
to_task int references tasks(id) ON DELETE CASCADE ON UPDATE CASCADE NOT NULL,
...
);
依存关系最终将是to_task
表中不存在的from_task
和tasks
的值(参见图片)
注意:
EXPLAIN
ANALYZE
没什么奇怪的arguments << "--file=" + fileName << "--username=" + connection.userName() << databaseName << "--format=c"
答案 0 :(得分:0)
这是索引(或表)损坏的问题,或者创建了约束,使有效性检查推迟到以后。
pg_dump
永远不会默默地“放弃”一个约束-在恢复您没有注意到的转储时可能会出错。
正确的解决方法是清理违反约束的数据并重新创建。
如果这是数据损坏问题,请检查硬件。
不需要定期检查数据是否损坏,PostgreSQL本身就没有破坏数据的习惯。
最好的测试方法是定期进行pg_dump
并查看还原转储是否引起任何错误。