一个聚集索引将实际数据行存储在索引的叶级别。回到上面的例子,这意味着与主键值123关联的整个数据行将存储在该叶节点中。
问题 - 如果主键不存在,我将Name
列设置为聚集索引。在这种情况下,上述语句是否会变得矛盾?
一个聚集索引将实际数据行存储在索引的叶级别。回到上面的例子,这意味着与主键值123关联的整个数据行将存储在该叶节点中。
问题 - 如果主键不存在,我将Name
列设置为聚集索引。在这种情况下,上述语句是否会变得矛盾?
不需要,为什么?
聚簇索引仍将在其叶节点上存储实际数据页面,并按name
列进行物理排序。索引导航结构在叶子级别以上将包含所有行的name
列值。
所以总体而言:没有改变。
主键是一个逻辑结构,旨在唯一标识表中的每一行。这就是为什么它必须是唯一且非空的原因。
聚簇索引是一个物理结构,最初会根据聚簇键对数据进行物理排序并相应地排列SQL Server页面。
虽然在SQL Server中,默认情况下使用主键作为聚簇键,但两者不必合并 - 也不必同时存在。您可以拥有具有非聚集主键的表,或者没有主键的聚集表。两者都是可能的。是否明智拥有它是另一个讨论问题 - 但从技术上讲是可能的。
更新: 如果您的主键是聚簇键,则保证唯一(因为主键必须是唯一的)。如果您选择的某个列不是主键而作为聚簇键,并且该列不能保证唯一性,则SQL Server将在幕后添加一个4字节(INT)唯一标识符列以使那些重复值唯一。因此,对于您的Smith,您可能会在聚集索引导航结构中有Smith
,Smith1
,Smith2
等。
参见: