2013-10-24 115 views
1

是否有可能建立在SQL Server数据库中的表,其中一列是主要的,另一列已聚集索引,如下图所示主键和聚集索引

create table tablename (id int primary key , contact int clustered index) 

这将是数据的顺序?

+1

你试过吗? – Fred

回答

1

它可以创建一个表,其中一列是PK和其他列有聚簇索引,就像这样:

CREATE TABLE TableName 
(ID INT NOT NULL PRIMARY KEY, 
Contact INT NOT NULL UNIQUE CLUSTERED) 
GO 

SQL Server将自动创建一个主键作为一个非聚集索引聚簇索引是在另一列上指定的。

数据的顺序在任何RDBMS中都不能保证。

1

在SQL Server中,您可以在任何可以编制索引的列上创建聚集索引。它不必与主键相同,而且聚集索引也不必是唯一的。

在SQL Server中确实没有一个真正的“数据顺序”。 逻辑聚簇索引内的页面排序被保持为双向链接列表,由此每个数据页面指向下一页和上一页。当您创建聚簇索引时,这些页面通常是某种程度上磁盘上的“相邻”页面,但SQL Server不会尝试维护任何物理顺序,并会根据需要拆分页面并在其他位置分配新页面。数据页内的行的逻辑顺序由每个页面上的槽阵列定义 - 行按分配顺序存储,而不是按页内的集群键顺序(即使在聚集索引中)。

但是,页面和行的逻辑排序与您在查询结果中看到的行的顺序无关。因此,对于您的问题的正确答案是,当您在查询中指定ORDER BY子句时,该顺序就是您希望的顺序。如果您没有指定ORDER BY,那么该订单是未定义的。