首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >损坏的pg_class数据?不存在表上的鬼索引

损坏的pg_class数据?不存在表上的鬼索引
EN

Stack Overflow用户
提问于 2015-01-20 16:04:50
回答 1查看 554关注 0票数 0

我正在运行一些创建/删除索引的问题。所以最初我

代码语言:javascript
复制
DROP INDEX IF EXISTS ros_tmp_schoolid_IX;

然后

代码语言:javascript
复制
CREATE INDEX ros_tmp_schoolid_IX on ros.sometable USING btree (somecolumn);

它抱怨索引已经存在。

然后我换了我的方法

代码语言:javascript
复制
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;

但是我仍然得到索引不存在error...so,我查看了pg_class表,我找到了该索引的记录。

我也尝试过以下所有方法,但都没有奏效:

  1. 放下桌子;
  2. 重新索引/分析/抽真空整个数据库
  3. 重索引表pg_class

我在Rails中使用PostgreSQL9.3(4.1.5)。在运行测试suite...when处理大量数据时,会随机发生这种情况,我使用临时表,并在工作完成后删除它们。

我不知道是什么引起了这个问题。还有什么需要我调查的吗?

谢谢!

=========

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

所以我试着在不同的表上用相同的名字创建索引,它是成功的。But..when,我试图再次放弃它.我得到的关系不存在错误。我试着在那之后运行CREATE查询,然后它说这个关系已经exists...postgres无法决定.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 22:54:51

短版本:您希望包含架构的名称:

代码语言:javascript
复制
 DROP INDEX IF EXISTS ros.ros_tmp_schoolid_IX;

解释

创建索引时,它会自动进入与指定的表相同的架构。甚至不允许使用架构名称,因为文档指出:

此处不能包含任何架构名称;索引总是在与其父表相同的架构中创建的。

但是,在删除索引时,如果模式不在搜索路径中,则需要指定它。在您的情况下,ros可能不在search_path中。

此外,正如注释中所提到的,一个索引名(带有大写字母,但不包含双引号)将被转换为小写,因此在CREATE INDEX ros_tmp_schoolid_IX ...之后,您将在pg_class.relname中找到ros_tmp_schoolid_ix

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28049892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档