Postgres索引名称的级别应该是什么级别?

问题描述:

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

索引和表(和意见,并序列,并...)都存储在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将自动分配一个唯一的名称。

  • 名称在模式中是唯一的。模式基本上是{表,约束}(和索引,函数等)的命名空间。
  • 允许跨模式约束
  • 索引与表共享其名称空间(:=模式)。 (对于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