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

6

我在同一个数据库(PostgreSQL)中创建了两个不同表的索引,但是出现了一个错误提示说该索引已经存在。事实上,这个索引确实存在,但是它存在于另一个表中。将其名称更改后,问题得到解决。

我想知道为什么会出现这种情况?为什么数据库设计成两个表不能有相同名称的索引?

我找到了两个答案,其中一个是针对MySQL,另一个是针对Postgres:

如何在Postgres中为现有表添加索引?

两个表使用相同的索引名称


可能是重复的问题:两个表使用相同的索引名称 - user177800
我不相信这是重复的,@JarrodRoberson。那个问题的答案表明,您可以拥有相同名称的索引,而我的问题暗示我的表不能具有相同的名称。我猜这是PostgreSQL特定的问题?我已经删除了MySQL标签。 - zebrainatree
2
你需要询问最初设计Postgres(或Oracle)的人。一些DBMS允许不同表使用相同的索引名称(例如MySQL,SQL Server),而另一些则不允许(Postgres,Oracle,DB2,Firebird)。这是开发人员在创建DBMS时做出的选择。 - user330315
感谢@a_horse_with_no_name。哈哈,我猜我希望Postgres的创造者之一能看到这篇文章:p。但我认为RudiDudi回答了我的问题。 - zebrainatree
3个回答

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标准不涉及创建索引的问题。

酷毛克。我没有意识到。谢谢你的建议! - zebrainatree

4

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


-1

因为它是一个数据库对象,就像一个表/视图/存储过程。 对于具有相同名称但不同列的两个表或具有相同名称但不同参数的两个存储过程,情况是相同的。


所以索引有点像数据库环境中的全局对象?我想象它们是其表的子公司,从而允许它们具有相同的名称。 - zebrainatree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接