我正在运行一些创建/删除索引的问题。所以最初我
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;但是我仍然得到索引不存在error...so,我查看了pg_class表,我找到了该索引的记录。
我也尝试过以下所有方法,但都没有奏效:
我在Rails中使用PostgreSQL9.3(4.1.5)。在运行测试suite...when处理大量数据时,会随机发生这种情况,我使用临时表,并在工作完成后删除它们。
我不知道是什么引起了这个问题。还有什么需要我调查的吗?
谢谢!
=========
另外,我在pg_class中发现了更多,我想我需要一个方法来清理它。
所以我试着在不同的表上用相同的名字创建索引,它是成功的。But..when,我试图再次放弃它.我得到的关系不存在错误。我试着在那之后运行CREATE查询,然后它说这个关系已经exists...postgres无法决定.
发布于 2015-01-20 22:54:51
短版本:您希望包含架构的名称:
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
https://stackoverflow.com/questions/28049892
复制相似问题