繁体   English   中英

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

[英]Why we can't have more than one primary key?

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

直接从SO拉出:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

但是,主键可以包含多个列 - 请参见7.5.2。 多列索引

主键是表中特定行的一个(可能很多)唯一标识符。 因此,未被指定为主要标识符的其他唯一标识符经常被称为次要唯一索引。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM