12

我有一个大型 .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. 然而,该项目构建良好并且部署良好。

这怎么可能是合法的?

4

3 回答 3

15

CREATE INDEX规范解释了这一点:

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

于 2013-05-20T10:14:03.350 回答
10

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

索引名称在表中必须是唯一的,而不是整个数据库。

于 2013-05-20T09:46:05.410 回答
10

它们在表中具有相同的名称,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 是sys.tables与 TableOne 和 TableTwo 相关的表中的 ID

于 2013-05-20T09:47:24.617 回答