听说只能有一个聚集索引?我可能是错的,但我确定我在某个地方读到过。
在我的 SQL Server 2005 表之一中,我有以下列:
SerialNum -------- BigInt -------- 主键
区-------- nvarchar(50)
SchemeType ------ nvarchar(50)
当我使用 SQL Server Management Studio 在设计模式下打开表时,我注意到为District启用了Clustered Index属性,而为SchemeType禁用了它。
如果只能有一个聚集索引,那么当SerialNum已经定义为主键时,为什么 District 会启用此属性?
如果可以有更多聚集索引,那么如何为SchemeType列启用此属性?
主键和聚集索引是两个不同的东西,尽管它们经常结合使用。您的桌子以这种方式结束的几个潜在原因:
(a) 它可以使用非聚集主键创建
PRIMARY KEY NONCLUSTERED
,然后添加聚集索引。(b) 可能已经添加了聚集索引,然后添加了主键(在这种情况下,它不能被聚集,因为已经有聚集索引)。
其中任何一个都可能是故意的设计决策、事故、事后的变化等。
忽略 Management Studio 设计视图中的属性。聚集索引是表,但它由指定的列定义。其他列在技术上仍然是聚集索引的一部分,它们只是不是索引中的键列。称“启用/禁用”具有误导性。
聚集索引只能有一个,因为聚集索引就是表数据本身。这是一种基于集群键组织表数据的方法。它类似于 Oracle 的索引组织表 (IOT)。非聚集索引是独立的数据结构。聚集索引是将数据本身组织为 b 树。
默认情况下,SQL Server 将主键作为聚集索引(如果还没有的话)。似乎在您的情况下,主键被创建为“非聚集索引”,列区被创建为“聚集索引”。
每个表只能有一个聚集索引。主键不是聚集索引。要回答您的问题:
如果只能有一个聚集索引,那么当 SerialNum 已经定义为主键时,为什么 District 会启用此属性?这是因为聚集索引是在 District 上创建的。只有这将显示为启用,其余的将显示为禁用。
如果可以有更多聚集索引,那么如何为 SchemeType 列启用此属性?一张表上不能有多个聚集索引。您必须删除 District 上的聚集索引并为 SchemeType 重新创建一个。如果您仍然想在 District 上保留聚集索引,那么您可以使用的一个技巧是创建一个索引视图,然后在视图上为 SchemeType 创建一个聚集索引。为此,您可能需要企业版。