如何在PostgreSQL中强制删除索引关系?

20

在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 上加入和不加入条件,观察索引使用是否有所差异。 - Richard Huxton
抱歉,在我发布解决方案之前,我没有看到你的评论。我想现在执行SELECT不会再提供线索了,因为我已经重建了一切。 - kentr
2个回答

35

除非您将 search_pathGUC设置为(或至少包括)tiger_data模式,否则您需要将模式添加到索引名称中以发出DROP INDEX命令(无论如何,我都会出于安全考虑使用它):

DROP INDEX tiger_data.tiger_data_sld_the_geom_gist;

这是因为索引总是指向它所属的表的相同模式(schema)。如果上述方法无法解决您的问题,您可以通过以下方法检查此关系名称是否存在,并且在每个模式中是否存在:

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';

该函数用于返回所有关系的种类(i代表索引,r代表表,S代表序列和v代表视图),该关系具有名称tiger_data_sld_the_geom_gist和所属模式的名称。


我正在写我的答案时,你的答案也出现了。我不确定这是否正确,所以如果是的话,我会让社区投票支持它。 - kentr
@kentr:我不能百分之百地保证这就是问题所在,但看起来你的(奇怪的,在我看来)方法似乎隐藏了真正的问题... - MatheusOl
当锤子不起作用时,使用大锤...(这是自嘲幽默)。我怀疑有比我的方法更好的方法。 - kentr
@kentr 在索引名称之前添加 schema_name 就解决了问题,谢谢。 - George.

-4

虽然不是特别高效,但这似乎解决了问题:

  1. 使用pg_dump转储表。
  2. 删除表。
  3. 使用pg_dump转储数据库。
  4. 删除数据库。
  5. 重新创建数据库并从转储文件中重新加载。

这可能是一个小型个人项目的解决方案,而不是正在运行的企业数据库的解决方案。 - adrz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接