2014-12-05 144 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

名稱是該架構中是唯一的(他們的名字將與_1_2,IIRC的後綴)。 (schema:=用於表和約束的命名空間(和函數等)(雖然允許跨模式約束)) – wildplasser 2014-12-05 00:04:48

+0

BTW:這是實際的錯誤消息嗎? ('idx_column_name'與'idx_pickup_geom'不同) – wildplasser 2014-12-05 00:13:52

+2

索引與表共享相同的命名空間(:= schema)。 (索引:=表)。你需要發明另一個名字(或者省略它:系統可以爲你創建一個名字) – wildplasser 2014-12-05 00:20:18

回答

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) 

每@ wildplasser的評論,您可以在創建索引時省略名稱,PG將自動分配一個唯一的名稱。

5
  • 名稱在模式中是唯一的。模式基本上是{表,約束}(和索引,函數等)的命名空間。
  • 允許跨模式約束
  • 索引與表共享其名稱空間(:=模式)。 (對於Postgres:索引的表格)。
  • (IIRC)SQL標準沒有定義索引;儘可能使用限制條件(問題中的GIST索引可能是例外)
  • Ergo您需要發明另一個名稱。
  • 或省略它:系統可以發明一個名稱,如果你不提供一個。
  • 這種方法的缺點:您可以創建multipe指數具有相同的定義
+0

這不是關於命名空間(:=架構)。如果內存服務,它是關於'pg_class'的約束。 :-) – 2014-12-05 00:57:34

+0

IIRC( - ;),目錄只使用數字ID。 (這是PK)命名空間/類在功能上依賴。其他(候選)鍵可能存在,例如{schema,table},甚至{objecttype,schema,name} – wildplasser 2014-12-05 01:00:38

+0

@wildplasser對於postgresql,索引是一個關係,而不是**表。關係是「大多數有列或類似於表的所有東西」(來自http://www.postgresql.org/docs/9.3/static/catalog-pg-class.html文檔),包括索引,視圖,序列等 – Patrick 2014-12-05 02:19:58