【发布时间】:2021-05-18 00:45:28
【问题描述】:
在 MySQL 中,我可以在不同的表中拥有相同的索引(相同的名称和列)。 从我目前看到的情况来看,Postgres 只允许我拥有一个带有名称的索引,即使我尝试在不同的表中创建它。
Postgres 真的不允许使用相同名称的索引还是我做错了什么?
【问题讨论】:
标签: postgresql indexing
在 MySQL 中,我可以在不同的表中拥有相同的索引(相同的名称和列)。 从我目前看到的情况来看,Postgres 只允许我拥有一个带有名称的索引,即使我尝试在不同的表中创建它。
Postgres 真的不允许使用相同名称的索引还是我做错了什么?
【问题讨论】:
标签: postgresql indexing
您是对的,索引、表、视图和序列共享相同的名称空间,因此如果这些对象中的任何两个在同一架构(= 名称空间)中,它们就不能具有相同的名称。
从目录表pg_class的表定义可以看出,其中包含所有这些对象:
\d pg_class
Table "pg_catalog.pg_class"
Column │ Type │ Collation │ Nullable │ Default
═════════════════════╪══════════════╪═══════════╪══════════╪═════════
oid │ oid │ │ not null │
relname │ name │ │ not null │
[...]
Indexes:
"pg_class_oid_index" UNIQUE, btree (oid)
"pg_class_relname_nsp_index" UNIQUE, btree (relname, relnamespace)
"pg_class_tblspc_relfilenode_index" btree (reltablespace, relfilenode)
第二个索引pg_class_relname_nsp_index 强制名称和架构的组合是唯一的。
【讨论】: