主键与聚类索引的关系

没有聚集索引,TABLE可以有主键吗?

和TABLE可以没有主键的聚簇索引?

任何人都可以简单地告诉我主键和聚集索引的关系吗?

主键是一个逻辑概念 – 它是表中一行的唯一标识符。 因此,它有一堆属性 – 它可能不是null,它必须是唯一的。 当然,由于您很可能正在通过其唯一标识符searchlogging,所以在主键上有一个索引是很好的。

聚集索引是一个物理概念 – 它是影响logging在磁盘上存储顺序的索引。 这使得它在访问数据时是一个非常快速的索引,但是如果你的主键不是一个连续的数字,它可能会减慢写入速度。

是的,你可以有一个没有聚集索引的主键 – 有时,你可能想(例如,当你的主键是join表​​上的外键的组合,并且你不想引起磁盘洗牌的开销写作时)。

是的,您可以在不是主键的列上创build聚集索引。

一个表可以有一个没有群集的主键,而一个群集表不需要主键。 所以这两个问题的答案是肯定的。

聚簇索引存储叶级别的所有列。 这意味着聚集索引包含表中的所有数据。 没有聚集索引的表称为堆。

主键是一个默认集群的唯一索引。 默认情况下,当您创build主键时,如果表尚未聚集,主键将被创build为聚簇唯一索引。 除非明确指定nonclustered选项。

一个示例,其中t1具有非聚集主键,并且t2不聚集,但具有主键:

 create table t1 (id int not null, col1 int); alter table t1 add constraint PK_T1 primary key nonclustered (id); create clustered index IX_T1_COL1 on t1 (col1); create table t2 (id int not null, col1 int); alter table t2 add constraint PK_T2 primary key nonclustered (id); 

SQL小提琴示例

首先,看看索引组织表和聚类索引 。 其实我推荐阅读整个使用索引卢克! 网站从一开始,直到你到达聚类主题,真正了解发生了什么事情。

现在,对你的问题…


没有聚集索引,TABLE可以有主键吗?

是的,使用NONCLUSTERED关键字来声明你的主键来创build一个基于堆的表。 例如:

 CREATE TABLE YOUR_TABLE ( YOUR_PK int PRIMARY KEY NONCLUSTERED -- Other fields... ); 

这是不幸的,因为很多人似乎只接受默认的(即CLUSTERED),尽pipe在很多情况下基于堆的表格实际上会更好(如链接文章中所讨论的)。


和TABLE可以没有主键的聚簇索引?

与其他一些数据库pipe理系统不同,MS SQL Server会让你拥有一个与主键不同的集群索引,甚至根本不需要主键。

下面的例子创build了一个与PK分开的集群索引,在它之上有一个UNIQUE约束,这在大多数情况下是你可能想要的:

 CREATE TABLE YOUR_TABLE ( YOUR_PK int PRIMARY KEY, YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED -- Other fields... ); 

如果您select非唯一集群索引(使用CREATE CLUSTERED INDEX ... ),则MS SQL Server将通过为其添加隐藏字段来自动使其唯一。

请注意,聚类的好处对于范围扫描来说是最明显的。 如果您使用不与您的客户端应用程序完成的范围扫描“alignment”的群集索引(例如过度依赖上面提到的隐藏列或在代理键上进行群集),那么您几乎可以击败聚类的目的。


任何人都可以简单地告诉我主键和聚集索引的关系吗?

在MS SQL Server下,主键也是默认集群 。 您可以更改该默认值,如上所述。

来自MSDN的答案使用聚集索引

没有聚集索引,TABLE可以有主键吗? – 是的。

没有主键的TABLE可以有聚簇索引吗? – 是的。

主键是一个确保值的唯一性的约束 ,这样一个行总是可以被该键特定的。

一个索引被自动分配给一个主键(因为行通常被他们的主键“查找”)。

非聚集索引是一行(或多列)的行的逻辑sorting。 把它看作是有效的另一个“副本”表,按索引所在的任何列sorting。

聚集索引是当实际表格由特定列物理sorting时。 一个表并不总是有一个聚集索引(即,虽然它将物理sorting的东西 ,那东西可能是未定义的 )。 一个表不能有多个聚集索引,虽然它可以有一个单一的复合聚集索引(即表格是物理sorting的,例如Surname,Firstname,DOB)。

PK通常(但不总是)聚集索引。

它可能不是作为这个问题的答案,但主键和聚集索引的一些重要方面是 – >

如果有一个主键(默认情况下是聚簇索引,但是我们可以改变它),那么我们就不能为该表创build一个聚簇索引。 但是,如果还没有主键集合,并且有聚簇索引,那么我们无法使用聚簇索引创build主键。

在MS SQL Server中,主键中的所有列必须定义为NOT NULL,而创build唯一的聚集索引不需要这样做。 不知道其他数据库系统,但。