主键和聚簇索引

时间:2013-10-24 10:43:34

标签: sql sql-server primary-key clustered-index

是否可以在SQL Server数据库中创建一个表,其中一列是主列,另一列是聚簇索引,如下所示

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

数据的顺序是什么?

2 个答案:

答案 0 :(得分:1)

可以创建一个表,其中一列是PK,另一列是聚簇索引,如下所示:

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

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

任何RDBMS都无法保证数据的顺序。

答案 1 :(得分:1)

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

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

页面和行的逻辑顺序不一定与您在查询结果中看到的行的顺序有关。因此,对您的问题的正确答案是,当您在查询中指定ORDER BY子句时,顺序是您希望的顺序。如果未指定ORDER BY,则该顺序未定义。