为什么我们不能拥有多个主键?

时间:2011-08-19 19:19:24

标签: sql primary-key

我知道表中的主键不能超过1个,但技术原因是什么?

12 个答案:

答案 0 :(得分:14)

直接从SO

拉出
  

您只能拥有一个主键,但主键中可以包含多个列。

     

您还可以在表上使用唯一索引,这有点像主键,因为它们会强制执行唯一值,并且会加快查询这些值。

Primary in the context of Primary Key means that it's ranked first in importance. Therefore, there can only be one key. It's by definition.

它通常也是索引附加实际数据的键,也就是说,数据与主键索引一起存储。其他索引仅包含被索引的数据,也可能包含一些包含的列。

答案 1 :(得分:9)

事实上,E.F.Codd(关系数据库模型的发明者)[1]发起了术语“主键”来表示关系中任意数量的键 - 而不仅仅是一个。他明确表示很可能拥有多个这样的钥匙。他的建议是数据库设计师可以选择一个密钥作为首选标识符(“ 主键”) - 但原则上这是可选的,这样的选择是“任意的”(这是他的话) 。因为所有键都具有相同的属性,所以没有必要选择任何一个键。

后来[2] Codd最初称为主键的内容被称为候选键,而单键被挑出来作为首选键被称为“主键”。然而,这并不是一个根本性的转变,因为主键意味着与候选键完全相同。因为它们是等同的概念,所以当我们说“必须”只有一个主键时,它并不意味着什么重要。如果您有多个候选键,如果您愿意,可以合理地称其为“主要”,因为它不会对数据库的含义和功能产生任何逻辑或实际差异。

有人(我和其他人)认为,将每个表的一个密钥指定为“主要”的想法完全是多余的,有时是对数据库设计和数据完整性问题的良好理解的积极阻碍。然而,这个概念是如此根深蒂固,我们可能会坚持下去。

因此,您的问题的正确答案是“惯例”和“便利”。根本就没有很好的技术理由。

[1]大型共享数据库的数据关系模型(1970)

[2]例如在“关系数据库模型的进一步规范化”(1971)

答案 2 :(得分:5)

PRIMARY KEY通常相当于UNIQUE INDEX NOT NULL。因此,您可以在一个表上有效地拥有多个“主键”。

答案 3 :(得分:5)

嗯,出于某种原因,它被称为“主要”。如同,它是唯一用于唯一标识记录的密钥......并且有“can be only one”。

您当然可以模仿第二个“主”键,方法是将索引放在一个或多个其他唯一的字段上但是出于数据库服务器的目的,通常只有在您的密钥不存在时才需要在合并复制情况下,它足够独特,可以跨数据库服务器。 (即:多主人)。

答案 4 :(得分:4)

主键是唯一标识该记录的键。

我不确定你是否要问a)是否可以有一个主键跨越多列,或b)如果你有多个唯一标识记录的键。

第一种可能,称为复合主键。

第二种也是可能的,但只有一种称为主键。

答案 5 :(得分:3)

因为“主键”中的“主要”表示其,mmm,奇点(?)。

但是如果你需要更多,你可以定义具有完全相同行为的UNIQUE个键。

答案 6 :(得分:3)

技术原因是只能有一个主要。否则就不会这样称呼。

但是主键可以包含多个列 - 请参阅7.5.2. Multiple-Column Indexes

答案 7 :(得分:2)

主键是表中特定行的唯一标识符(可能很多)。其他唯一标识符(未指定为)通常被称为辅助唯一索引。

答案 8 :(得分:1)

主键允许我们唯一地标识表中的每条记录。表中可以有2个主键,但它们称为复合主键。 “当您在表上定义多个列作为主键时,它将被称为复合主键。”

答案 9 :(得分:1)

主键定义记录唯一性。有两种不同的唯一性度量可能会有问题。例如,如果您有主键A和B并且您插入A相同且B不同的记录,那么这些记录是相同还是不同?如果你认为它们不同,那么让你的主要成为A和B的复合。如果你认为它们是相同的记录,那么只需使用A或B作为主键。

答案 10 :(得分:0)

  1. 对于非聚集索引,我们可以创建两个索引,通常在JOIN,WHERE和ORDER BY子句中使用的非主键列上进行。
  2. 在聚集索引中,我们只有一个索引和主键上的索引。因此,如果我们有两个主键,则存在歧义。
  3. 同样在参考完整性中,选择两个主键之一是不明确的。

答案 11 :(得分:-1)

表上只有一个主键可用,因为主键在表上创建聚簇索引,该索引基于该主键列以有序方式在叶节点上物理存储数据。 如果我们尝试在该表上创建另一个主键,则会出现与数据相关的一个主要问题。因为无法以两个不同的顺序存储该表的相同数据。