Sql server SQL中的主键、索引和约束

Sql server SQL中的主键、索引和约束,sql-server,Sql Server,如果我错了,请改正。请给我指出关于这个概念的文章 当我们创建一个主键时,在后台会自动创建一个唯一索引、聚集索引和在该列上创建的NOTNULL约束 这是否也意味着,如果我们在列上创建一个非null约束、[聚集索引或非聚集索引]和唯一索引,那么该列将成为主键 我想了解主键、索引和约束之间的核心概念/关系。否 所有列都可以添加非空和非聚集索引和唯一,但只能添加一列 并且唯一允许空,而主键不允许 您可能正在谈论候选密钥,以下是参考: 主键是声明为“主键”的键。仅仅具备这些特征并不能使关键点成为“主要的”

如果我错了,请改正。请给我指出关于这个概念的文章

当我们创建一个主键时,在后台会自动创建一个唯一索引、聚集索引和在该列上创建的NOTNULL约束

这是否也意味着,如果我们在列上创建一个非null约束、[聚集索引或非聚集索引]和唯一索引,那么该列将成为主键

我想了解主键、索引和约束之间的核心概念/关系。

所有列都可以添加
非空
非聚集索引
唯一
,但只能添加一列

并且
唯一
允许
,而
主键
不允许

您可能正在谈论
候选密钥
,以下是参考:

主键是声明为“主键”的键。仅仅具备这些特征并不能使关键点成为“主要的”。必须明确声明它是这样的

不同的数据库以不同的方式实现主键。虽然主键通常使用聚集唯一索引实现,但这不是一个要求

主键正是它的名字所暗示的:“primary”。任何其他列或列组都可以声明为
唯一
非空
。这并不使它们成为主键。在某些数据库中,您甚至可以将另一列或一组列定义为
非空
唯一
和集群,而不必将其作为主键

总之:

  • 一个表上可以有任意数量的唯一索引
  • 在表的非空列上可以有任意数量的唯一索引
  • 您最多可以有一个聚集索引。在几乎所有情况下,这都是主键。但并非所有数据库中都需要
  • 您最多可以有一个主键。在几乎所有情况下,这都是集群的,尽管并非所有数据库都需要集群
有关更多详细信息,请参阅正在使用的数据库的文档

如果您有多个包含非NULL唯一键的列,那么只有一个是“primary”——即显式声明为primary的列

为什么要使用非群集主键?我可以给出一个场景。设想一个数据库,其中uuid是行的键。该公司不希望使用自动生成的序列号,因为它们在序列号中提供信息


然而,UUID对于聚集索引来说是非常糟糕的候选者,因为插入几乎从不在末尾。在这种情况下,您可能希望使用集群自动生成的顺序键设计表,为了加快插入,您可以将该键设为主键。但是,您希望所有外键引用都使用UUID,并且希望所有外键引用都指向表的主键。

我的问题只涉及一列。我想我是清楚的。我的问题现在有意义了吗?@variable,Gordon已经指定PK应该是显式declaredTanks。为什么反之亦然?如果我们有多个约束相同的列,你怎么知道哪一个是PK?@LONG。声明为主键的。在大多数数据库中,元数据都有这样的信息。请告诉我unique是索引还是约束?在后台,unique键是作为索引还是约束实现的?两者都有。它被实现为一个唯一的索引;但它的功能是作为一个约束,因为优化器认为它是这样的,并将使用该知识优化查询。谢谢Ross,请与我们分享任何涉及此主题的文章Microsoft SQL SERVER