postgresql - 如果外键所在的表不存在,如何删除外键?

标签 postgresql corruption postgresql-8.4

场景:

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/

相关文章:

postgresql - 使用 dblink 在 PostgreSQL 中的数据库之间同步事务

sql - 处理 SQL FILESTREAM 数据损坏和备份

postgresql - Postgres动态更新约束外键

sql - 从函数 postgresql 输出到屏幕并记录文件

postgresql - 当声明出现语法错误时 declare postgresql

postgresql - 使用 pg_dump 结果作为 pg_restore 的输入

postgresql - Oracle 查询未在 PostgreSQL 中执行

image - 平均损坏图像以消除 MATLAB 中的噪声的问题

c# - 是否有可能在损坏的部分之外恢复损坏的 Zlib 数据?

ruby-on-rails-3.2 - 耙工作 :work gives "PGError: ERROR: SELECT FOR UPDATE/SHARE is not allowed in subqueries"