2014-12-05 16 views
9

In Microsoft SQL Server e MySQL, i nomi di indice devono essere univoci all'interno della tabella, ma non all'interno del database. Questo non sembra essere il caso di PostgreSQL.A quale livello i nomi degli indici di Postgres devono essere univoci?

Ecco cosa sto facendo: ho creato una copia di una tabella utilizzando CREATE TABLE new_table AS SELECT * FROM old_table ecc. E ho bisogno di ricreare gli indici.

Esecuzione di una query come CREATE INDEX idx_column_name ON new_table USING GIST(column_name) provoca ERROR: relation "idx_column_name" already exists

Che cosa sta succedendo qui?

+1

I nomi sono unici all'interno dello schema. (schema: = spazio dei nomi per tabelle e vincoli (e funzioni, ecc.) (sebbene i vincoli dello schema incrociato siano consentiti)) – wildplasser

+0

BTW: è questo il messaggio di errore effettivo? ('idx_column_name' è diverso da' idx_pickup_geom') – wildplasser

+2

Gli indici condividono lo stesso spazio dei nomi (: = schema) con le tabelle. (indice: = tabella). Avrai bisogno di inventare un altro nome (o di ometterlo: il sistema può inventarti un nome) – wildplasser

risposta

14

indici e le tabelle (e punti di vista, e le sequenze, e ...) sono memorizzati nel catalogo pg_class, e sono unici per ogni schema a causa di una chiave univoca su di esso:

# \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 @ commento di wildplasser, è possibile omettere il nome durante la creazione dell'indice e PG assegnerà automaticamente un nome univoco.

5
  • I nomi sono univoci all'interno dello schema. Uno schema è fondamentalmente uno spazio dei nomi per {tabelle, vincoli}, (e indici, funzioni, ecc.).
  • I vincoli di schema incrociato sono consentiti
  • Gli indici condividono lo spazio dei nomi (: = schema) con le tabelle. (per Postgres: un indice è un tavolo).
  • (IIRC) lo standard SQL non definisce gli indici; usa i vincoli ogni volta che puoi (l'indice GIST nella domanda è probabilmente un'eccezione)
  • Ergo Avrai bisogno di inventare un altro nome.
  • oppure omettalo: il sistema può inventare un nome se non ne fornisci uno.
  • L'aspetto negativo di questo: è possibile creare indici multipe con la stessa definizione (i loro nomi saranno suffisso _1, _2, IIRC)
+0

Non si tratta dello spazio dei nomi (: = schema). Se la memoria serve, si tratta di vincoli su 'pg_class'. :-) –

+0

IIRC (-;), i cataloghi utilizzano solo l'ID numerico. (che è PK) lo spazio dei nomi/classe è dipendente dal punto di vista funzionale. Possono esistere altre chiavi (candidate), come {schema, tabella} o anche {objecttype, schema, nome} – wildplasser

+0

@wildplasser Per postgresql un indice è una relazione, ** non ** una tabella. Una relazione è "la maggior parte di tutto ciò che ha colonne o è in qualche modo simile a una tabella" (dal http://www.postgresql.org/docs/9.3/static/catalog-pg-class.html doc), inclusi gli indici, le viste , sequenze, ecc. – Patrick

Problemi correlati