如何在 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 中找出碎片索引并对其进行碎片整理?

如何快速掌握 Navicat for PostgreSQL表索引

Postgresql:条件唯一约束

删除 PostgreSQL 中索引的唯一性

如何在 PostgreSQL 中实现多对多关系?

如何强制合并连接?