8

聚集索引将实际数据行存储在索引的叶级别。回到上面的例子,这意味着与主键值 123 关联的整行数据将存储在该叶节点中。

在此处输入图像描述

问题- 如果主键不存在并且我将Name列设置为聚集索引。在这种情况下,上述说法是否会变得矛盾?

4

3 回答 3

23

没有为什么?

聚集索引仍将其叶级存储实际数据页,(最初)按name列物理排序。

叶级以上的索引导航结构将包含name所有行的列值。

总体而言:没有任何变化。

是一个逻辑结构,旨在唯一标识表中的每一行。这就是为什么它必须是唯一且非空的。

簇索引是一种物理构造,它将(最初)按聚簇键对数据进行物理排序,并相应地排列 SQL Server 页面。

而在 SQL Server 中,默认情况下使用主键作为集群键,两者不必同时存在 - 也不必与另一个同时存在。您可以拥有一个具有非聚集主键的表,也可以拥有一个没有主键的聚集表。两者都是可能的。这样做是否明智是另一个讨论 - 但在技术上是可能的。

更新:如果您的主键是您的集群键,则保证唯一性(因为主键必须是唯一的)。如果您选择某个不是主键的列作为集群键,并且该列不能保证唯一性,SQL Server 将在幕后为这些重复值添加一个 4 字节 (INT) 唯一性列以生成他们独一无二。因此,您的 Smith's 的聚集索引导航结构中可能有Smith、等。Smith1Smith2

看:

于 2012-05-29T12:47:33.017 回答
3

如果聚集索引不是唯一的,SQL Server 会创建一个 4 字节的唯一符并将其添加到聚集索引值中。仅当聚集索引值重复时才添加唯一符,而不是针对所有聚集索引值。所有非聚集索引都将在其叶级包含此值,非唯一非聚集索引在其非叶级条目中也将具有此唯一性值,作为书签的一部分。

于 2012-09-02T07:17:27.923 回答
2

主键和唯一索引(或约束)之间的区别在于主键列中不允许 Null 值。表上不需要主键,但它使外部应用程序更容易编辑表中的行,即便如此,对于大多数外部应用程序来说,这并不是必需的。

在性能方面,这没有任何改变。重要的是索引的存在或不存在(唯一与否,是否聚集以及是否具有空值),主键本质上只是一个没有空值的唯一索引。

对于聚集索引,列不需要是唯一的和/或没有空值。具有重复值和空值的列适用于创建聚集索引。

对于外键,它必须引用具有唯一索引但不一定是主键或没有空值的列。引用一个不是主键的列是完全合法的,只要它有唯一索引就允许空值。请注意,因为它必须有一个唯一索引,所以该列不能有多个空值。

外键列本身(外表上的列)没有限制,但在性能方面,在其上设置索引通常是一件好事。

于 2012-05-29T12:51:05.130 回答