Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么我们可以';您没有多个主键吗?_Sql_Primary Key - Fatal编程技术网

Sql 为什么我们可以';您没有多个主键吗?

Sql 为什么我们可以';您没有多个主键吗?,sql,primary-key,Sql,Primary Key,我知道一个表中不能有超过1个主键,但技术原因是什么?主键通常相当于唯一索引NOTNULL。因此,您可以在一个表上有效地拥有多个“主键”。好吧,它之所以被称为“主键”是有原因的。在中,它是用来唯一标识记录的一个键。。。在那里 通过将索引放在一个或多个唯一的其他字段上,您当然可以模仿第二个“主键”,但对于数据库服务器而言,通常只有在密钥不够唯一,无法在合并复制情况下跨数据库服务器时才需要索引。(即:多主控)。因为“主键”中的“主”表示其,mmm,奇点(?) 但是如果您需要更多,您可以定义具有完全相同

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

主键
通常相当于
唯一索引NOTNULL
。因此,您可以在一个表上有效地拥有多个“主键”。

好吧,它之所以被称为“主键”是有原因的。在中,它是用来唯一标识记录的一个键。。。在那里

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

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


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

技术原因是只能有一个。否则就不会这么叫了

但是,主键可以包括多个列-请参见直接从以下列中提取的

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

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


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

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

我不确定您是否询问a)是否可以有一个主键跨越多个列,或者b)是否可以有多个键唯一标识记录

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


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

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

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

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

< P>实际上,E.F.Codd(关系数据库模型的发明人)[1]开创了“主键”一词来表示一个关系的任意数量的键,而不仅仅是一个键。他明确表示,拥有不止一把这样的钥匙是完全可能的。他的建议是,数据库设计者可以选择一个键作为首选标识符(“主键”)——但原则上这是可选的,这样的选择是“任意的”(这是他的话)。因为所有键都具有彼此相同的属性,所以根本不需要选择任何一个键

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

有人(我和其他人一起)认为,将每个表指定一个键作为“主键”的想法是完全多余的,有时会妨碍对数据库设计和数据本质问题的良好理解。然而,这个概念是如此根深蒂固,我们可能会被它卡住

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

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

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

  • 对于非聚集索引,我们可以创建两个索引,通常在JOIN、WHERE、ORDER BY子句中使用的非主键列上创建
  • 而在聚集索引中,我们只有一个索引和一个主键上的索引。因此,如果我们有两个主键,就存在歧义
  • 在参照积分中,选择两个主键中的一个也存在歧义

  • 表上只能有一个主键,因为主键在表上创建一个聚集索引,该索引根据主键列按顺序在叶节点上物理存储数据。
    如果我们试图在该表上创建另一个主键,那么将出现与数据相关的一个主要问题。因为be不能以两个不同的2顺序存储表中的相同数据。

    如果有多个主键,它将不再被称为“主键”。拥有一个以上的主键有什么好处呢?想象一下,一个班级里都是小学生。老师:“彼得,你做作业了吗?”彼得·史密斯:“是的”彼得·米勒:“不”彼得·琼斯:“是的”老师:“彼得·米勒,你做作业了吗?”彼得·米勒:“不”我投你两次票。一次回答,第二次回答