如何在 postgresql 中强制删除索引关系?
Posted
技术标签:
【中文标题】如何在 postgresql 中强制删除索引关系?【英文标题】:How to force drop index relation in postgresql? 【发布时间】:2013-09-05 23:56:57 【问题描述】:在 PostgreSQL 9.2 / PostGIS 2.0.2 中,我在空间列上有一个索引,创建于
CREATE INDEX tiger_data_sld_the_geom_gist ON tiger_data.sld USING gist(the_geom);
随后删除了索引
DROP INDEX tiger_data_sld_the_geom_gist;
但是现在,当我尝试重新创建时,我收到了这个错误:
# CREATE INDEX tiger_data_sld_the_geom_gist ON tiger_data.sld USING gist(the_geom);
ERROR: relation "tiger_data_sld_the_geom_gist" already exists
再次丢弃不起作用。它说索引不存在:
# DROP INDEX tiger_data_sld_the_geom_gist;
ERROR: index "tiger_data_sld_the_geom_gist" does not exist
我没有在任何数据库对象列表中找到关系“tiger_data_sld_the_geom_gist”,已尝试 DROP TABLE,并四处寻找解决方案。
这个神秘的关系“tiger_data_sld_the_geom_gist”是什么,如何删除它以便创建索引?
编辑:
还尝试重新启动服务器,并转储/删除/重新加载表(使用 CASCADE 删除)。
【问题讨论】:
尝试“SELECT * FROM pg_class”并查看列出的内容。尝试在 relname、relnamespace 上使用和不使用条件,看看索引使用是否有所不同。 抱歉,我在发布解决方案之前没有看到您的评论。我想现在执行 SELECT 不会显示任何线索,因为我已经重建了所有内容。 【参考方案1】:除非您将search_path
GUC 设置为(或至少包括)tiger_data
架构,否则您需要将架构添加到索引名称以发出DROP INDEX
(无论如何我都会使用它为了安全):
DROP INDEX tiger_data.tiger_data_sld_the_geom_gist;
那是因为索引总是指向它所属表的同一个模式。如果上述方法不能解决您的问题,您可以检查此关系名称是否存在,以及在每个架构上是否存在以下内容:
SELECT r.relname, r.relkind, n.nspname
FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid
WHERE r.relname = 'tiger_data_sld_the_geom_gist';
它将返回名称为 tiger_data_sld_the_geom_gist
和其所属模式名称的任何关系的类型(i
用于索引,r
用于表,S
用于序列,v
用于视图)到。
【讨论】:
你的答案是在我写我的时候出现的。我不知道这是否正确,所以如果是,我会让社区投票。 @kentr:我不能 100% 保证确实如此,但您的(奇怪的,恕我直言)方法似乎隐藏了真正的问题...... :-)。当锤子不起作用时,使用大锤......(这是自嘲的幽默)。我怀疑有比我更好的方法。 @kentr 在索引名称之前添加 schema_name 可以解决问题,谢谢。【参考方案2】:虽然不是特别有效,但这似乎起到了作用:
-
使用 pg_dump 转储表。
放下桌子。
使用 pg_dump 转储数据库。
删除数据库。
重新创建数据库并从转储文件重新加载。
【讨论】:
这可能是一个小型个人副项目的解决方案,而不是一个正在运行的企业数据库。以上是关于如何在 postgresql 中强制删除索引关系?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PostgreSQL 中找出碎片索引并对其进行碎片整理?