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
这是怎么回事?
索引和表(和意见,并序列,并...)都存储在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指数具有相同的定义
这不是关于命名空间(:=架构)。如果内存服务,它是关于'pg_class'的约束。 :-) – 2014-12-05 00:57:34
IIRC( - ;),目录只使用数字ID。 (这是PK)命名空间/类在功能上依赖。其他(候选)键可能存在,例如{schema,table},甚至{objecttype,schema,name} – wildplasser 2014-12-05 01:00:38
@wildplasser对于postgresql,索引是一个关系,而不是**表。关系是“大多数有列或类似于表的所有东西”(来自http://www.postgresql.org/docs/9.3/static/catalog-pg-class.html文档),包括索引,视图,序列等 – Patrick 2014-12-05 02:19:58
名称是该架构中是唯一的(他们的名字将与
_1
,_2
,IIRC的后缀)。 (schema:=用于表和约束的命名空间(和函数等)(虽然允许跨模式约束)) – wildplasser 2014-12-05 00:04:48BTW:这是实际的错误消息吗? ('idx_column_name'与'idx_pickup_geom'不同) – wildplasser 2014-12-05 00:13:52
索引与表共享相同的命名空间(:= schema)。 (索引:=表)。你需要发明另一个名字(或者省略它:系统可以为你创建一个名字) – wildplasser 2014-12-05 00:20:18