2013-09-02 4 views
7

В PostgreSQL 9.2/PostGIS 2.0.2 Я имел индекс пространственного столбца, созданного сКак заставить отношение индекса индекса в postgresql?

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» и как его удалить, чтобы я мог создать индекс?

Edit:

Также попробовал перезапустить сервер, и сброс/опускание/перезагрузки таблицы (отсев с каскадом).

+0

Попробуйте «SELECT * FROM pg_class» и посмотрите, что указано в списке. Попробуйте с условием relnamespace и без него, и посмотрите, не влияет ли использование индекса. –

+0

Извините, я не видел вашего комментария, прежде чем отправил свое решение. Я полагаю, что выполнение SELECT не будет раскрывать подсказки сейчас, так как я перестроил все. – kentr

ответ

11

Если вы не устанавливаете 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'; 

Это вернет вид (i для индексов, r для таблиц, S для последовательностей и v для представлений) любого отношения, которое имеет имя tiger_data_sld_the_geom_gist и имя схемы, к которой она принадлежит.

+0

Ваш ответ пришел, когда я писал. Я не знаю, правильно это или нет, поэтому я позволю сообществу, если это так. – kentr

+0

@kentr: Я не могу гарантировать со 100%, что это было так, но, похоже, ваш (странный, IMHO) подход, похоже, скрыл настоящую проблему ... – MatheusOl

+0

:-). Когда молот не работает, используйте кувалду ... (это должно быть самоуничижительным юмором). Я подозревал, что есть лучший метод, чем мой. – kentr

0

Хотя не особенно эффективно, это, кажется, сделал трюк:

  1. дамп таблицы с pg_dump.
  2. Опустить стол.
  3. Дамп базы данных с pg_dump.
  4. Оставьте базу данных.
  5. Восстановите базу данных и перезагрузите файлы дампа.
Смежные вопросы