SQL中的主键,索引和约束

时间:2017-04-12 19:35:33

标签: sql-server

如果我错了,请更正。请指点关于这个概念的文章。

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

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

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

2 个答案:

答案 0 :(得分:1)

主键是声明为“主”键的键。只是具有这些特征并不能成为关键的“主要”。必须明确声明它。

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

主键正是它的名字所暗示的:“主要”。可以同时声明任何其他列或列组uniquenot null。这不会成为他们的主键。在某些数据库中,您甚至可以将另一列或一组列定义为not nullunique 群集 - 而不是主键。

总结:

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

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

如果您有多个包含非NULL,唯一键的列,那么只有一个是“primary” - 那个已经明确声明为primary的列。

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

但是,UUID对于集群索引来说是非常糟糕的候选者,因为插入几乎从不在最后。在这种情况下,您可能希望使用群集自动生成的顺序密钥设计表,以加速插入您可以将此密钥作为主键。但是,您希望所有外键引用都使用UUID - 并且您希望所有外键引用都是表的主键。

答案 1 :(得分:0)

没有。

所有列都可以添加Not nullNon-clustered index以及Unique,但只有 ONE 列才能成为PK。

Unique允许NULLPrimary Key则不允许。

你可能在谈论Candidate Key,这里是参考: https://www.techopedia.com/definition/21/candidate-key