pg_class 数据损坏?幽灵索引不存在 table

corrupted pg_class data? ghost index on non-existent table

我 运行 解决了 creating/dropping 索引的一些问题。 所以本来我有

DROP INDEX IF EXISTS ros_tmp_schoolid_IX;

然后

CREATE INDEX ros_tmp_schoolid_IX on ros.sometable USING btree (somecolumn);

它抱怨索引已经存在

然后我将我的方法切换为

IF EXISTS (SELECT 1
            FROM   pg_class c
            JOIN   pg_namespace n ON n.oid = c.relnamespace
            WHERE  c.relname = 'ros_tmp_schoolid_IX'
            AND    n.nspname = 'ros')
THEN
    DROP INDEX ros_tmp_schoolid_IX;
END IF;

但我仍然收到索引不存在的错误...因此我查看了 pg_class table,我能够找到该索引的记录。

我也尝试了以下所有方法并且 none 有效:

  1. 删除 table;
  2. reindex/analyze/vacuum整个数据库
  3. 重新索引tablepg_class

我在 Rails(4.1.5) 中使用 Postgresql 9.3。当 运行 在我的测试套件中随机发生这种情况......在处理大块数据时,我正在使用临时 tables 并在工作完成后删除它们。

我不确定是什么导致了这个问题。还有什么我应该检查的吗?

谢谢!

=========

另外,我在 pg_class 中发现了更多,我想我需要一种方法来清理它。

所以我尝试在不同的 table 上创建具有相同名称的索引,并且成功了。 但是..当我再次尝试删除它时...我得到了关系不存在的错误。在那之后我尝试 运行 CREATE INDEX 查询,然后它说关系已经存在...postgres 无法决定...

简短版本:您要包含架构的名称:

 DROP INDEX IF EXISTS ros.ros_tmp_schoolid_IX;

解释:

创建索引时,它会自动进入与指定的 table 相同的模式。甚至不允许使用架构名称,如 doc 所示:

No schema name can be included here; the index is always created in the same schema as its parent table

但是,删除索引时,如果架构不在搜索路径中,则需要指定架构。大概 ros 在你的情况下不在 search_path 中。

另外如评论中所述,索引名称为大写但未包含在双引号中的索引名称将转换为小写,因此在 CREATE INDEX ros_tmp_schoolid_IX ... 之后,您会在 [= 中找到 ros_tmp_schoolid_ix 15=]