2014-12-05 5 views
9

В Microsoft SQL Server и MySQL имена индексов должны быть уникальными в таблице, но не в базе данных. Это не похоже на PostgreSQL.На каком уровне имена индексов Postgres должны быть уникальными?

Вот что я делаю: я сделал копию таблицы с использованием CREATE TABLE new_table AS SELECT * FROM old_table и т. Д. И вам нужно заново создать индексы.

Запуск запроса как CREATE INDEX idx_column_name ON new_table USING GIST(column_name) вызывает ERROR: relation "idx_column_name" already exists

Что здесь происходит?

+1

имен уникальны в пределах схемы. (schema: = пространство имен для таблиц и ограничений (и функции и т. д.). (хотя допускаются ограничения между схемами) – wildplasser

+0

BTW: это фактическое сообщение об ошибке? ('idx_column_name' отличается от' idx_pickup_geom') – wildplasser

+2

Индексы используют одно и то же пространство имен (: = schema) с таблицами. (index: = table). Вам нужно придумать другое имя (или опустить его: система может придумать вам имя) – wildplasser

ответ

14

Индексы и таблицы (и представление, и последовательность, и ...) сохраняются в pg_class каталоге, и они уникальны по схеме из-за уникальный ключ на нем:

# \d pg_class 
     Table "pg_catalog.pg_class" 
    Column  | Type | Modifiers 
----------------+-----------+----------- 
relname  | name  | not null 
relnamespace | oid  | not null 
... 
Indexes: 
    "pg_class_oid_index" UNIQUE, btree (oid) 
    "pg_class_relname_nsp_index" UNIQUE, btree (relname, relnamespace) 

Per @ wildplasser, вы можете опустить имя при создании индекса, и PG автоматически назначит уникальное имя.

5
  • Имена уникальны в схеме. Схема - это пространство имен для {таблиц, ограничений}, (и индексов, функций и т. Д.).
  • Разрешения на перекрестную схему разрешены
  • Индексы разделяют пространство имен (: = schema) с таблицами. (для Postgres: индекс - таблица).
  • (IIRC) стандарт SQL не определение индексы; используйте ограничения использования, когда это возможно (индекс GIST в вопросе, вероятно, является исключением)
  • Ergo Вам нужно придумать другое имя.
  • или опустить его: система может придумать имя, если вы его не дадите.
  • Недостаток этого: вы можете создать индексы с кратными тем же определением (их имена будут с суффиксом _1, _2, IIRC)
+0

Речь идет не о пространстве имен (: = schema). Если память работает, речь идет о ограничениях на 'pg_class'. :-) –

+0

IIRC (-;), в каталогах используется только числовой идентификатор. (который является PK) пространство имен/класс функционально зависимо. Другие (кандидатские) ключи могут существовать, например {schema, table} или даже {objecttype, schema, name} – wildplasser

+0

@wildplasser. Для postgresql индекс является отношением **, а не ** таблицей. Отношение - это «большинство всего, что имеет столбцы или иначе похоже на таблицу» (из http://www.postgresql.org/docs/9.3/static/catalog-pg-class.html doc), включая индексы, представления , последовательности и т. д. – Patrick

Смежные вопросы