2

设想:

DELETE FROM table_x WHERE id not in (1,2,3,4)

回复:

表“table_x”上的更新或删除违反了表“table_y”上的外键约束“fk1” 详细信息:键(table_x_id)=(7)仍然从表“table_y”中引用。

  • 清空所有记录的“table_y”
  • FK 未显示在“table_y”的 FK 列表中
  • 完全删除表'table_y'

我们仍然收到此消息,因此假设表中某处存在 rouge 记录pg_constraints。寻找约束“fk1”,我们找到两条记录并删除它们。

询问:

delete from pg_constraint where conname = 'fk1'

现在我们得到这个错误:

[Err] 错误:约束 868152 的缓存查找失败

在这一点上,我相当肯定我们需要清理一些记录,但不确定如何 - 任何人都有这方面的经验可以为我指明正确的方向吗?

4

1 回答 1

0

这听起来像是一个糟糕的索引。请注意,这里的解决方案是部分的。你需要找出根本原因是什么。我过去看到的原因包括硬盘驱动器和 RAM 故障,以及 CPU 过热或故障。

外键约束命中唯一索引。如果您在这里看到奇怪的行为,则问题可能是一个错误的索引。尝试重新索引所涉及的表甚至整个数据库以解决问题。

我不认为这是由于没有吸尘造成的。xid 环绕在发生时是令人讨厌的,但最近的版本竭尽全力防止这种情况发生。可能这充其量是索引损坏。如果不是这样,那就是数据损坏(请注意,索引损坏在 IME 中发生的频率要高得多,但数据损坏的原因都是一样的,所以要找到问题统计的根源)。

于 2013-04-05T05:39:41.843 回答