37

In Microsoft SQL Server and MySQL, index names need to unique within the table, but not within the database. This doesn't seem to be the case for PostgreSQL.

Here's what I'm doing: I made a copy of a table using CREATE TABLE new_table AS SELECT * FROM old_table etc and need to re-create the indexes.

Running a query like CREATE INDEX idx_column_name ON new_table USING GIST(column_name) causes ERROR: relation "idx_column_name" already exists

What's going on here?

Community
  • 1
  • 1
Martin Burch
  • 2,726
  • 4
  • 31
  • 59

2 Answers2

42

Indexes and tables (and views, and sequences, and...) are stored in the pg_class catalog, and they're unique per schema due to a unique key on it:

# \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's comment, you can omit the name when creating the index, and PG will assign a unique name automatically.

Denis de Bernardy
  • 75,850
  • 13
  • 131
  • 154
9
  • Names are unique within the schema. A schema is basically a namespace for {tables,constraints}, (and indexes, functions,etc).
  • cross-schema-constraints are allowed
  • Indexes share their namespace ( :=schema) with tables. (for Postgres: an index is a table).
  • (IIRC) the SQL standard does not define indexes; use constraints whenever you can (The GIST index in the question is probably an exception)
  • Ergo You'll need to invent another name.
  • or omit it: the system can invent a name if you dont supply one.
  • The downside of this: you can create multipe indices with the same definition (their names will be suffixed with _1, _2, IIRC)
Paul Grimshaw
  • 19,894
  • 6
  • 40
  • 59
wildplasser
  • 43,142
  • 8
  • 66
  • 109
  • It's not about the namespace (:= schema). If memory serves, it's about constraints on `pg_class`. :-) – Denis de Bernardy Dec 05 '14 at 00:57
  • IIRC (-;) ,the catalogs only use numeric ID. (which is PK) the namespace/class is functionally dependant. Other (candidate) keys may exist, such as {schema, table}, or even {objecttype, schema, name} – wildplasser Dec 05 '14 at 01:00
  • @wildplasser To postgresql an index is a relation, **not** a table. A relation is "most everything that has columns or is otherwise similar to a table" (from the http://www.postgresql.org/docs/9.3/static/catalog-pg-class.html doc), including indexes, views, sequences, etc. – Patrick Dec 05 '14 at 02:19