web-dev-qa-db-fra.com

Comment forcer la relation d'index de chute dans postgresql?

Dans PostgreSQL 9.2/PostGIS 2.0.2, j’avais un index sur une colonne spatiale, créé avec

CREATE INDEX tiger_data_sld_the_geom_Gist ON tiger_data.sld USING Gist(the_geom);

Par la suite abandonné l'index avec

DROP INDEX tiger_data_sld_the_geom_Gist;

Mais maintenant, quand j'essaye de recréer, j'obtiens cette erreur:

#  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

Redémarrer ne fonctionne pas. Il dit que l'index n'existe pas:

# DROP INDEX tiger_data_sld_the_geom_Gist;
ERROR:  index "tiger_data_sld_the_geom_Gist" does not exist

Je n'ai pas trouvé la relation "tiger_data_sld_the_geom_Gist" dans une liste d'objets de base de données, j'ai essayé DROP TABLE et cherché des solutions.

Quelle est cette relation mystérieuse "tiger_data_sld_the_geom_Gist", et comment puis-je la supprimer pour pouvoir créer l'index?

Modifier:

Nous avons également essayé de redémarrer le serveur et de décharger/déposer/recharger la table (supprimé avec CASCADE).

12
kentr

Sauf si vous définissez le code search_path GUC sur (ou du moins en incluant) le schéma tiger_data, vous devez ajouter le schéma au nom de l'index pour générer le DROP INDEX (je l'utiliserais de toute façon par sécurité):

DROP INDEX tiger_data.tiger_data_sld_the_geom_Gist;

C'est parce que l'index va toujours au même schéma de la table à laquelle il appartient. Si les solutions ci-dessus ne résolvent pas votre problème, vous pouvez vérifier si ce nom de relation existe et qu'il figure sur chaque schéma, avec les éléments suivants:

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

Il renverra le type (i pour les index, r pour les tables, S pour les séquences et v pour les vues) de toute relation portant le nom tiger_data_sld_the_geom_Gist et le nom du schéma auquel elle appartient.

20
MatheusOl

Bien que pas particulièrement efficace, cela semble avoir fait le tour:

  1. Vide la table avec pg_dump.
  2. Laisse tomber la table.
  3. Videz la base de données avec pg_dump.
  4. Supprimer la base de données.
  5. Recréez la base de données et rechargez à partir des fichiers de vidage.
0
kentr