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

时间:2013-09-02 20:48:55

标签: 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);

随后使用

删除索引
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删除)。

2 个答案:

答案 0 :(得分:20)

除非您将search_path GUC设置为(或至少包括)tiger_data架构,否则您需要将架构添加到索引名称以发出DROP INDEX(I' d在任何情况下都用它来保证安全):

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

它将返回类型(i用于索引,r用于表,S用于序列,v用于视图)的任何关系,其名称为{{ 1}}和它所属的架构的名称。

答案 1 :(得分:-1)

虽然不是特别有效,但这似乎已经成功了:

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