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

ken*_*ntr 15 postgresql postgis postgresql-9.2

在PostgreSQL 9.2/PostGIS 2.0.2中,我在空间列上有一个索引,用

CREATE INDEX tiger_data_sld_the_geom_gist ON tiger_data.sld USING gist(the_geom);
Run Code Online (Sandbox Code Playgroud)

随后掉了索引

DROP INDEX tiger_data_sld_the_geom_gist;
Run Code Online (Sandbox Code Playgroud)

但现在,当我尝试重新创建时,我收到此错误:

#  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
Run Code Online (Sandbox Code Playgroud)

再次删除不起作用.它说索引不存在:

# DROP INDEX tiger_data_sld_the_geom_gist;
ERROR:  index "tiger_data_sld_the_geom_gist" does not exist
Run Code Online (Sandbox Code Playgroud)

我没有在任何数据库对象列表中找到关系"tiger_data_sld_the_geom_gist",尝试了DROP TABLE,并搜索了解决方案.

这个神秘关系是什么"tiger_data_sld_the_geom_gist",如何删除它以便我可以创建索引?

编辑:

还尝试重新启动服务器,并转储/删除/重新加载表(使用CASCADE删除).

Mat*_*sOl 23

除非您将search_pathGUC 设置为(或至少包括)tiger_data模式,否则您需要将模式添加到索引名称以发出DROP INDEX(我在任何情况下都使用它以确保安全性):

DROP INDEX tiger_data.tiger_data_sld_the_geom_gist;
Run Code Online (Sandbox Code Playgroud)

那是因为索引总是转到它所属的表的相同模式.如果上述方法无法解决您的问题,您可以检查此关系名称是否存在,以及它所处的每个架构是否存在以下内容:

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';
Run Code Online (Sandbox Code Playgroud)

它将返回具有其所属架构的名称和名称的任何关系的类型(i对于索引,r对于表,S对于序列和v对于视图)tiger_data_sld_the_geom_gist.