为什么两个表都不能有相同名称的索引?

时间:2014-11-18 15:04:43

标签: database postgresql

我在同一个数据库(PostgreSQL)中的两个单独的表上创建索引,并且我收到一条错误,指出索引已经存在。这是真的,但是,索引存在于另一个表中。更改名称后,它有效。

我想知道为什么会这样?为什么数据库的设计使得两个表不能具有相同的索引名称?

虽然答案不同,但我找到了两个回答这个问题的消息来源。一个用于MySQL,另一个用于Postgres:

In postgres how do I add index to existing table?

Same index name for two tables

3 个答案:

答案 0 :(得分:5)

您可以拥有两个同名的索引。他们不能处于同一架构中。就像你可以有两个同名的表,但不是在同一个模式中。

sandbox=# create schema test;
CREATE SCHEMA
sandbox=# create table public.a (a_id integer not null);
CREATE TABLE
sandbox=# create table test.a (a_id integer not null);
CREATE TABLE
sandbox=# create index a_idx on public.a (a_id);
CREATE INDEX
sandbox=# create index a_idx on test.a (a_id);
CREATE INDEX

这反映了PostgreSQL设计师的决定。 SQL标准不涉及创建索引。

答案 1 :(得分:2)

因为索引存储在表pg_class中。在该表中,有一个由索引名称和命名空间组成的复合键,这就是为什么不能有两个具有相同名称的索引属于同一命名空间的原因。

答案 2 :(得分:-1)

因为它是一个db对象,就像表/视图/过程一样。 对于具有相同名称但不同列的两个表,或者具有相同名称但参数不同的两个过程,它们是相同的。