2017-04-12 62 views
1

如果我错了,请更正。请向我指出关于这个概念的文章。SQL中的主键,索引和约束条件

当我们创建一个主键时,在后台会自动创建一个唯一的索引,聚簇索引和一个非空约束。

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

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

+0

Microsoft SQL SERVER – variable

回答

1

主键是被声明为“主”键之一。只有具备这些特点并不能成为关键的“主要”。它必须被明确地声明。

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

主键正是顾名思义:“主”。任何其他列或列组都可以声明为uniquenot null。这不会使他们成为主键。在某些数据库中,甚至可以定义另一列或一组列,如not null,unique集群 - 没有那个主键。

总结:

  • 你可以有任意数量的表上唯一索引。
  • 您可以在表上的非NULL列上拥有任意数量的唯一索引。
  • 您最多只能有一个聚簇索引。在几乎所有情况下,这将是主要关键。但并非所有数据库都需要。
  • 最多只能有一个主键。在几乎所有情况下,这都会聚集在一起,尽管这在所有数据库中都不是必需的。

有关更多详细信息,请参阅您正在使用的数据库的文档。

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

为什么你会有一个非群集主键?我可以举一个场景。设想一个数据库,其中UUID是行的关键字。该公司不希望使用自动生成的序列号,因为它们提供了号码中的信息。

但是,对于集群索引而言,UUID是非常差的候选对象,因为插入几乎不会结束。在这种情况下,您可能希望使用集群自动生成的顺序键来设计表,以加快插入速度您可以将此键设为主键。但是,您希望所有外键引用都使用UUID,并且您希望所有外键引用都是表的主键。

+0

我的问题只涉及一列。我以为我很清楚。我的问题现在有意义吗? – variable

+0

@variable,Gordon已经指定PK应该明确声明 – LONG

+0

谢谢。那么为什么反之亦然呢? – variable

0

所有列可以用Not nullNon-clustered indexUnique但只有ONE栏添加可以PK。

Unique允许NULLPrimary Key不允许。

你可能会谈论Candidate Key,这里是裁判: https://www.techopedia.com/definition/21/candidate-key

+0

如果唯一索引或约束是否唯一,您能否提供建议? – variable

+0

你是什么意思?我不明白大声笑 – LONG

+0

在后台 - 是一个唯一的键实现为索引或约束? – variable