在MySQL中,我可以在不同的表中拥有相同的索引(相同的名称和列),从我目前看到的情况来看,Postgres只允许我拥有一个具有名称的索引,即使我试图在不同的表中创建它。Postgres真的不允许同名索引吗?还是我做错了什么?
gwbalxhn1#
您是对的,索引、表、视图和序列共享相同的名称空间,因此,如果这些对象中的任何两个在相同的模式(=名称空间)中,它们就不能具有相同的名称。您可以从目录表pg_class的表定义中看到这一点,该表包含所有这些对象:
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强制名称和模式的组合是唯一的。
pg_class_relname_nsp_index
1条答案
按热度按时间gwbalxhn1#
您是对的,索引、表、视图和序列共享相同的名称空间,因此,如果这些对象中的任何两个在相同的模式(=名称空间)中,它们就不能具有相同的名称。
您可以从目录表
pg_class
的表定义中看到这一点,该表包含所有这些对象:第二个索引
pg_class_relname_nsp_index
强制名称和模式的组合是唯一的。