Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 主键与聚集索引的关系_Sql_Sql Server_Database_Database Design - Fatal编程技术网

Sql 主键与聚集索引的关系

Sql 主键与聚集索引的关系,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,表是否可以有没有聚集索引的主键 一个表是否可以在没有主键的情况下拥有聚集索引 有谁能简单地告诉我主键和聚集索引之间的关系吗?表可以有一个未聚集的主键,而聚集表不需要主键。所以这两个问题的答案都是肯定的 聚集索引存储叶级别的所有列。这意味着聚集索引包含表中的所有数据。没有聚集索引的表称为堆 主键是默认情况下聚集的唯一索引。默认情况下,当您创建主键时,如果表尚未聚集,则主键将被创建为聚集唯一索引。除非明确指定非聚集选项 例如,t1具有非聚集主键,t2未聚集但具有主键: create table t1

表是否可以有没有聚集索引的主键

一个
是否可以在没有主键的情况下拥有聚集索引


有谁能简单地告诉我主键和聚集索引之间的关系吗?

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

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

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

例如,
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);

主键是一个逻辑概念-它是表中一行的唯一标识符。因此,它有一系列属性——它可能不是空的,而且必须是唯一的。当然,由于您可能经常通过记录的唯一标识符来搜索记录,所以最好在主键上有一个索引

聚集索引是一个物理概念,它影响记录在磁盘上的存储顺序。这使得它在访问数据时成为一个非常快速的索引,尽管如果主键不是序列号,它可能会减慢写入速度

是的,您可以拥有一个没有聚集索引的主键——有时您可能想要(例如,当您的主键是连接表上的外键组合,并且您不想在写入时产生磁盘无序移动开销时)

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

答案取自

表是否可以具有没有聚集索引的主键?-对

表是否可以具有没有主键的聚集索引对

主键是一个确保值唯一性的约束,这样一行总是可以由该键专门标识

索引自动分配给主键(因为行通常由主键“查找”)

非聚集索引是按一(或多)列对行进行逻辑排序。可以将其视为表的另一个“副本”,按索引所跨越的任何列排序

聚集索引是指实际表按特定列进行物理排序。一个表并不总是有一个聚集索引(也就是说,虽然它在物理上是按某个对象排序的,但该对象可能是未定义的)。一个表不能有多个聚集索引,尽管它可以有一个复合聚集索引(即该表按姓氏、名字、DOB等物理顺序排列)


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

首先,看一看。事实上,我建议从一开始就阅读整个网站,直到你接触到集群主题,以真正了解发生了什么

现在,对于你的问题


表是否可以具有没有聚集索引的主键

是的,在声明主键以生成基于堆的表时使用非聚集关键字。例如:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);
这是不幸的,因为许多人似乎只接受默认值(集群),即使在许多情况下,基于堆的表实际上会更好(如链接文章中所讨论的)


一个表可以有没有主键的聚集索引

与其他一些DBMS不同,MS SQL Server将允许您拥有一个不同于主键的聚类索引,或者甚至没有主键

下面的示例创建了一个独立于PK的聚类索引,它上面有一个唯一的约束,这在大多数情况下可能是您想要的:

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);
如果选择非唯一的聚集索引(使用
创建聚集索引…
),MS SQL Server将通过向其添加隐藏字段自动使其唯一

请注意,群集的好处对于范围扫描最为明显。如果您使用的聚类索引与客户端应用程序执行的范围扫描不“对齐”(例如过度依赖上面提到的隐藏列,或者在一个数据库上进行聚类),那么聚类的目的就大打折扣了


有谁能简单地告诉我主键和聚集索引的关系吗


在MS SQL Server下,默认情况下主键也是集群的。您可以更改默认设置,如上所述。

它可能与此问题的答案无关,但主键和聚集索引的一些重要方面是->

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

无论如何,在MS SQL Server中,主键中的所有列都必须定义为非空,而创建唯一聚集索引则不需要此项。但不确定其他数据库系统。

在SQL Server中,主键默认情况下是集群的-除非您明确告诉它不要集群。但这只是一个默认值,不是一个要求。一个表可以有没有任何索引的主键?因为,当我说一列是主键时,默认情况下创建的是聚集索引。当删除索引时,表不再包含主键?这更多的是答案下的注释,标记为正确答案。欢迎-我给你a+1,因为我看到你还没有添加注释的声誉。(在那里,做了那件事:)嗨。主题是