同时建立主键(PRIMARY KEY)与聚集索引(Clustered Index)的先后顺序

数据库在创建主键同时,会自动建立一个唯一索引。如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,则建立主键时候,同时建立一个唯一的聚集索引。

所以建立主键(PRIMARY KEY)与聚集索引(Clustered Index)的先后顺序就只有下面几种情况:

为了更方面的描述,假设我们有如下表:

CREATE TABLE [dbo].[User](  [UserName] [nvarchar](10) NOT NULL,  [Email] [nvarchar](100) NULL ) ON [PRIMARY]  GO


 情况一、在没有任何索引的表上建主键,同时自动产生唯一的聚集索引。

这种情况最简单。在表设计中,通过下图方式设置主键,同时不做任何其他修改,就会在建主键的同时,自动建立了唯一的聚集索引。

 

同时自动建立的主键和聚集索引

 

 情况二、在没有任何索引的表上先建聚集索引,再建主键。

我们如下面2幅图方式创建索引:

这个索引的参数设置如下图:

 

这个聚集索引创建好后如下:

 

这时候,我们再按照情况一的方式在表设计中创建主键。

完成后,主建和索引的情况如下图:

 

显然,这种情况下在创建主键的同时,建立了一个唯一的非聚集索引。

上面演示情况下,显然 PK_User 这个唯一的非聚集索引没有任何存在的价值。

 

情况三、在有非聚集索引表(即堆)上,先建主键。

情况三和情况四的初始环境都如下,存在一个非聚集索引。

 

 结果如下,类似于情况一,建主键时自动建立一个唯一的聚集索引。

需要注意的是:

没有聚集索引,有非聚集索引的表非聚集索引的行指针会指向数据堆,聚集索引重建时非聚集索引的行指针又会指回聚集索引的行位置。建聚集索引会导致现有的非聚集索引全部重新组织一边。

 

情况四,在有非聚集索引的表,先建聚集索引,再建主键。

这时候的结果如下图:

类似于情况二。

 

 其他情况:

其他情况都可以归入上述四类。

比如:在一个同时存在聚集索引,非聚集索引的表上建主键,就可以归入情况二。

 

一个表最多一个主键,最多一个聚集索引。

posted @ 2011-10-31 18:28  QQ天堂  阅读(750)  评论(0编辑  收藏  举报