我有一个很大的.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
。然而,该项目建设得很好并且部署得很好。
这怎么合法?
答案 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