web-dev-qa-db-ja.com

postgresqlでインデックス関係を強制的に削除するにはどうすればよいですか?

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でドロップ)してみました。

16
kentr

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)を返します。所属するスキーマの名前。

24
MatheusOl

特に効率的ではありませんが、これでうまくいったようです:

  1. Pg_dumpでテーブルをダンプします。
  2. テーブルを削除します。
  3. Pg_dumpでデータベースをダンプします。
  4. データベースを削除します。
  5. データベースを再作成し、ダンプファイルからリロードします。
0
kentr