我在同一个数据库(PostgreSQL)中创建了两个不同表的索引,但是出现了一个错误提示说该索引已经存在。事实上,这个索引确实存在,但是它存在于另一个表中。将其名称更改后,问题得到解决。
我想知道为什么会出现这种情况?为什么数据库设计成两个表不能有相同名称的索引?
我找到了两个答案,其中一个是针对MySQL,另一个是针对Postgres:
我在同一个数据库(PostgreSQL)中创建了两个不同表的索引,但是出现了一个错误提示说该索引已经存在。事实上,这个索引确实存在,但是它存在于另一个表中。将其名称更改后,问题得到解决。
我想知道为什么会出现这种情况?为什么数据库设计成两个表不能有相同名称的索引?
我找到了两个答案,其中一个是针对MySQL,另一个是针对Postgres:
您可以拥有两个相同名称的索引,但它们不能在同一模式中。就像您可以拥有两个相同名称的表,但不能在同一模式中。
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
因为索引存储在表pg_class中。在该表中有一个由索引名称和命名空间组成的复合键,这就是为什么您不能拥有属于相同命名空间的两个具有相同名称的索引。
因为它是一个数据库对象,就像一个表/视图/存储过程。 对于具有相同名称但不同列的两个表或具有相同名称但不同参数的两个存储过程,情况是相同的。