【问题标题】:Why can't two tables have an index of the same name?为什么两个表不能有同名的索引?
【发布时间】:2014-11-18 15:04:42
【问题描述】:

我正在同一个数据库 (PostgreSQL) 中的两个单独的表上创建索引,但我收到一条错误消息,指出索引已存在。这是真的,但是,索引存在于不同的表上。改名后,就成功了。

我想知道为什么会这样?为什么数据库设计成两个表不能同名索引?

我发现有两个来源可以回答这个问题,尽管答案不同。一个用于 MySQL,另一个用于 Postgres:

In postgres how do I add index to existing table?

Same index name for two tables

【问题讨论】:

  • 我不相信它是重复的,@JarrodRoberson。该问题的答案表明您可以拥有同名的索引,而我的问题暗示我的表不能具有相同的名称。我想这是一个 PostgreSQL 特定的问题?我已经删除了 MySQL 标签
  • 您需要询问为 Postgres(或 Oracle)进行初始设计的人员。一些 DBMS 确实允许不同表(例如 MySQL、SQL Server)使用相同的索引名称,而有些则不允许(Postgres、Oracle、DB2、Firebird)。这是开发人员在创建 DBMS 时所做的选择。
  • 谢谢@a_horse_with_no_name。大声笑,我想我希望 Postgres 的创建者之一会看到这篇文章:p。但我认为 RudiDudi 回答了我的问题

标签: database postgresql


【解决方案1】:

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

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

【讨论】:

  • 酷迈克。没有意识到这一点。感谢您的意见!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    因为它是一个数据库对象,就像一个表/视图/过程。 对于两个同名但列不同的表,或者两个同名但参数不同的过程,都是一样的。

    【讨论】:

    • 所以索引有点像数据库环境中的全局对象?我想他们是他们表的附属,因此允许他们有相同的名字。
    猜你喜欢
    • 2013-05-14
    • 2015-12-19
    • 1970-01-01
    • 2015-04-25
    • 2019-08-18
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多