【发布时间】:2015-03-18 22:47:37
【问题描述】:
我在创建/删除索引时遇到了一些问题。 所以最初我有
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 表,我能够找到该索引的记录。
我也尝试了以下所有方法,但均未奏效:
- 丢表;
- 重新索引/分析/清理整个数据库
- 重新索引表 pg_class
我正在使用带有 Rails(4.1.5) 的 Postgresql 9.3。这在运行我的测试套件时随机发生......在处理大块数据时,我正在使用临时表并在作业完成后删除它们。
我不确定是什么导致了这个问题。还有什么我应该研究的吗?
谢谢!
=========
另外,我在 pg_class 中发现了更多,我想我需要一种方法来清理它。
所以我尝试在不同的表上创建具有相同名称的索引,并且成功。 但是..当我再次尝试删除它时...我得到关系不存在错误。在那之后我尝试运行 CREATE INDEX 查询,然后它说关系已经存在...... postgres无法决定......
【问题讨论】:
-
DROP INDEX IF EXISTS "ros_tmp_schoolid_IX";(以及将来:避免混合大小写标识符;它们是 PITA,恕我直言) -
你好 joop,它告诉我跳过,因为索引不存在。我在这里要做的是 1. 清理 pg_class 中的无效记录; 2. 重新创建这个索引。 (重新索引不起作用,因为索引不存在)。感谢您的命名建议。
-
(SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ILIKE 'ros_tmp_schoolid_IX' AND n.nspname = 'ros')的结果是什么? -
它返回 1 :) @joop 也
select *返回索引的名称和 oid 等。 -
现在试试
SELECT c.relname FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ILIKE 'ros_tmp_schoolid_IX' AND n.nspname = 'ros' ;并在您的删除索引语句中完全使用该名称用双引号。
标签: database postgresql indexing postgresql-9.3