为什么我允许有两个同名的索引?

sha*_*oth 12 sql t-sql sql-server indexing visual-studio-2010

我有一个很大的.sqlproj项目.在一个.sql文件中,我有一个表定义:

CREATE TABLE [dbo].[TableOne] (
    [ColumnName] UNIQUEIDENTIFIER NULL
);
GO
CREATE UNIQUE CLUSTERED INDEX [TableOneIndex]
  ON [dbo].[TableOne]([ColumnName] ASC;
Run Code Online (Sandbox Code Playgroud)

在另一个.sql文件中,我有另一个表定义:

CREATE TABLE [dbo].[TableTwo] (
    [ColumnName] UNIQUEIDENTIFIER NULL
);
GO
CREATE UNIQUE CLUSTERED INDEX [TableOneIndex]
  ON [dbo].[TableTwo]([ColumnName] ASC;
Run Code Online (Sandbox Code Playgroud)

请注意,两个索引都被调用TableOneIndex.然而,该项目建设良好,并部署良好.

这怎么合法?

Rem*_*anu 14

CREATE INDEX规范解释了这一点:

index_name是索引的名称.索引名称在表或视图中必须是唯一的,但在数据库中不必是唯一的.索引名称必须遵循标识符规则.


Ste*_*han 10

由于它们是2个独立的表而且TableTwo 不是视图TableOne,因此在两个表上具有相同的索引名称是完全正常的

索引名称必须是表中的UNIQUE而不是整个数据库.


Dar*_*ren 9

它们在SYS.INDEX表中具有相同的名称,但它们具有完全不同OBJECT_ID的名称.

看着那(这 sys.tables

  SELECT * FROM
  SYS.TABLES
  WHERE NAME LIKE 'TABLE%'
Run Code Online (Sandbox Code Playgroud)

然后做:

  SELECT * FROM SYS.INDEXES 
  WHERE OBJECT_ID IN (245575913
,277576027)
Run Code Online (Sandbox Code Playgroud)

其中对象ID是sys.tables与TableOne和TableTwo相关的表中的ID