在Microsoft SQL Server和MySQL中,索引名称需要在表中唯一,但不在数据库中。对于PostgreSQL来说,情况似乎并非如此。
以下是我正在做的事情:我使用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
这里发生了什么?
答案 0 :(得分:19)
索引和表(以及视图,序列和...)存储在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)
Per @ wildplasser的评论,您可以在创建索引时省略名称,PG将自动分配唯一的名称。
答案 1 :(得分:5)
_1
,_2
,IIRC为后缀