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

时间:2013-05-20 09:41:10

标签: sql sql-server visual-studio-2010 tsql indexing

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

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

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

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

请注意,这两个索引都称为TableOneIndex。然而,该项目建设得很好并且部署得很好。

这怎么合法?

3 个答案:

答案 0 :(得分:13)

CREATE INDEX规范解释了这一点:

  

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

答案 1 :(得分:9)

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

索引名称必须是表 NOT 整个数据库中的唯一。

答案 2 :(得分:8)

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

查看sys.tables

  SELECT * FROM
  SYS.TABLES
  WHERE NAME LIKE 'TABLE%'

然后执行:

  SELECT * FROM SYS.INDEXES 
  WHERE OBJECT_ID IN (245575913
,277576027)

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