`primary key` 关键字与 SQL Server 中的聚簇索引有何关系?
Posted
技术标签:
【中文标题】`primary key` 关键字与 SQL Server 中的聚簇索引有何关系?【英文标题】:How does the `primary key` keyword relate to clustered indexes in SQL Server? 【发布时间】:2011-04-09 09:30:39 【问题描述】:PRIMARY KEY 关键字与 SQL Server 中的聚簇索引有何关系?
(有些人似乎想回答这个问题而不是a different question I asked,所以我给他们一个更好的地方回答。)
【问题讨论】:
【参考方案1】:
PRIMARY KEY
关键字与 MS SqlServer 中的聚集索引有何关系?
默认情况下,PRIMARY KEY
被实现为聚集索引。但是,您也可以通过非聚集索引来支持它(在其声明中指定 NONCLUSTERED
选项)
聚集索引不一定是PRIMARY KEY
。它甚至可以是非唯一的(在这种情况下,一个名为 uniqueifier
的隐藏列被添加到每个键中)。
请注意,聚集索引并不是真正的索引(即,表的投影顺序不同,引用原始记录)。它是表本身,原始记录是有序的。
当您创建聚集索引时,您并没有真正“创建”任何可以从表中删除的内容。您只需重新排列表本身并更改记录的存储方式。
【讨论】:
在创建聚集索引时,确实会创建根索引页和中间页。仍然 +1。【参考方案2】:主键,顾名思义,是表中一行的primary 唯一标识符。聚集索引根据索引对数据进行物理排序。虽然 SQL Server 默认会聚集一个主键,但两者之间并没有直接关系。
【讨论】:
【参考方案3】:表的聚集索引通常定义在主键列上。
但这并不是一个严格的要求。
来自MSDN:
当您创建 PRIMARY KEY 约束时,如果表上的聚簇索引尚不存在并且您没有指定唯一的非聚簇索引,则会自动创建一个或多个列上的唯一聚簇索引。
还有:
如果指定了非聚集主键约束,您可以在主键列以外的列上创建聚集索引。
【讨论】:
以上是关于`primary key` 关键字与 SQL Server 中的聚簇索引有何关系?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以为每个数据库禁用“sql_require_primary_key”?
sql MySQL_multi_primary_key.sql