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

mr_*_*air 6 sql primary-key

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

Tar*_*ryn 14

直接从SO拉出:

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

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

主键背景下的主要意味着它在重要性方面排名第一.因此,只能有一个键.这是定义.

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


nvo*_*gel 9

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

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

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

所以对你的问题的正确答案是"惯例"和"便利".根本没有好的技术理由.

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

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


Luc*_*cas 5

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


Not*_*tMe 5

好吧,它被称为"主要"是有原因的.如同,它是用于唯一识别记录的一个键......并且" 只能有一个 ".

您当然可以通过将索引放在一个或多个其他唯一字段上来模仿第二个"主"密钥,但是对于数据库服务器而言,通常只有在密钥不够独特以跨越数据库服务器时才需要它.合并复制情况.(即:多主人).

  • @inflagranti:只是不要点击两次;) (3认同)
  • 你也可以有一个LOTR参考.统治他们的一把钥匙! (3认同)