`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 中的聚簇索引有何关系?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中key和primary key的区别

是否可以为每个数据库禁用“sql_require_primary_key”?

sql MySQL_multi_primary_key.sql

SQL PRIMARY KEY 约束SQL FOREIGN KEY 约束SQL CHECK 约束

使用sql获取primary key名称

SQL PRIMARY KEY 约束