【问题标题】:At what level do Postgres index names need to be unique?Postgres 索引名称在什么级别需要是唯一的?
【发布时间】:2015-02-03 01:42:37
【问题描述】:

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

这是怎么回事?

【问题讨论】:

  • 名称在模式中是唯一的。 (schema := 表和约束(和函数等)的命名空间。(尽管允许跨模式约束))
  • 顺便说一句:这是实际的错误消息吗? (idx_column_nameidx_pickup_geom 不同)
  • 索引与表共享相同的命名空间 (:=schema)。 (索引:=表)。你需要发明另一个名字(或省略它:系统可以为你发明一个名字)
  • @wildplasser 感谢您的解释和建议。我给了它+1。想要将其添加为答案?
  • 我可以。哦,好吧:也许我应该。对于未来的读者。

标签: postgresql indexing


【解决方案1】:
  • 名称在架构中是唯一的。架构基本上是 {tables,constraints}(以及索引、函数等)的命名空间。
  • 允许跨模式约束
  • 索引与表共享其命名空间 (:=schema)。 (对于 Postgres:索引一个表)。
  • (IIRC) SQL 标准没有定义索引;尽可能使用约束(问题中的 GIST 索引可能是一个例外)
  • 因此,您需要另起一个名字。
  • 或者省略它:如果你不提供一个名字,系统可以发明一个名字。
  • 这样做的缺点:您可以创建具有相同定义的多个索引(它们的名称将以_1_2、IIRC 为后缀)

【讨论】:

  • 这与命名空间(:= 架构)无关。如果没有记错的话,那就是对pg_class 的限制。 :-)
  • IIRC (-;) ,目录只使用数字ID。 (这是 PK)命名空间/类在功能上是依赖的。可能存在其他(候选)键,例如 {schema, table},甚至 {objecttype, schema, name}
  • @wildplasser 对于 postgresql 来说,索引是一个关系,不是一个表。关系是“几乎所有具有列或与表类似的东西”(来自postgresql.org/docs/9.3/static/catalog-pg-class.html 文档),包括索引、视图、序列等。
【解决方案2】:

索引和表(以及视图、序列和...)存储在 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 会自动分配一个唯一的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多