场景:
DELETE FROM table_x WHERE id not in (1,2,3,4)
响应:
update or delete on table "table_x" violates foreign key constraint "fk1" on table "table_y" DETAIL: Key (table_x_id)=(7) is still referenced from table "table_y".
- 清空“table_y”的所有记录
- FK 未显示在“table_y”的 FK 列表中
- 完全删除了表“table_y”
我们仍然收到此消息,因此假设在 pg_constraints
表中的某处存在 rouge 记录。寻找约束“fk1”,我们找到两条记录并将其删除。
查询:
delete from pg_constraint where conname = 'fk1'
现在我们得到这个错误:
[Err] ERROR: cache lookup failed for constraint 868152
在这一点上,我相当确定我们需要清理一些记录,但不确定如何 - 任何人在这方面有经验可以为我指明正确的方向吗?
最佳答案
这听起来像是一个糟糕的索引。请注意,此处的解决方案是部分的。您需要找出根本原因是什么。我过去见过的原因包括硬盘驱动器和 RAM 出现故障,以及 CPU 过热或出现故障。
外键约束命中唯一索引。如果您在这里看到奇怪的行为,则问题可能是索引错误。尝试重新索引所涉及的表甚至整个数据库以解决问题。
我不认为这是由于无法吸尘引起的。 xid wraparound 发生时很讨厌,但最近的版本竭尽全力防止这种情况发生。这充其量可能是索引损坏。如果不是这样,那就是数据损坏(请注意,索引损坏在 IME 中发生的频率要高得多,但数据损坏的发生原因都是一样的,因此请找到问题根源统计)。
关于postgresql - 如果外键所在的表不存在,如何删除外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11620886/