候选键和主键之间有什么区别?

Cel*_*tas 50 sql relational-database

主键是为给定表选择的所选候选键吗?

Joh*_*Woo 92

Candidate Key- 候选键可以是任何列或列的组合,可以作为数据库中的唯一键.一个表中可以有多个候选键.每个候选人密钥都可以作为主要密钥.

Primary Key- 主键是唯一标识记录的列或列组合.只有一个候选键可以是主键.

更多关于此链接的示例


Wal*_*tty 20

就其而言,John Woo的回答是正确的.以下是一些补充要点.

主键始终是候选键之一.通常,它是唯一的候选人.

没有候选键的表不表示关系.如果您使用关系模型来帮助您构建一个好的数据库,那么您设计的每个表都将至少有一个候选键.

没有主键的概念,关系模型将是完整的.它不在关系模型的原始表示中.实际上,使用没有声明主键的外键引用会导致混乱.这可能是一个逻辑上正确的混乱,但它仍然是一个烂摊子.声明主键可让DBMS帮助您实施数据规则.大多数情况下,让DBMS帮助您实施数据规则是一件好事,非常值得花费.

一些数据库设计者和一些用户对主键是否标识表中的行(记录)或表所代表的主题中的实体实例存在一些精神上的困惑.在一个理想的世界中,它应该两者兼顾,并且实体表中的行与相应实体的实例之间应该存在一对一的对应关系.

在现实世界中,事情变得搞砸了.有人两次进入同一个新员工,员工最终得到两个ID.有人被雇用,但数据输入在一些手动过程中滑过了裂缝,员工没有得到身份证,直到遗漏得到纠正.第一次搞砸事情时不会崩溃的数据库比那种情况更强大.

  • 我完全支持你,直到你*似乎*建议使用现实世界的值作为主键,当你说“实体表中的行和相应实体的实例之间应该存在一对一的对应关系”。我强烈建议不要这样做,因为总有可能出现您从未考虑过的例外情况。例如,数据库设计人员可能会认为“我将使用一个人的名字作为主键”,然后一个人结婚或通过契约调查更改他们的名字。或者设计师使用汽车注册号作为PK,然后有人得到个性化的注册。等等等等 (2认同)
  • 我不是**建议使用自然键.这是一个单独的主题.我建议的是,主键的值与实体的实例之间应该存在一对一的对应关系.例如,这可能会因重复数据输入而搞砸. (2认同)

Hab*_*bib 10

主键 - >可以唯一标识表中记录的任何列或列集是主键.(表中只能有一个主键)

候选键 - > 候选成为主键的任何列或列都是候选键.(表中可以有一个或多个候选键,如果只有一个候选键,则可以选择它作为主键)

  • -1所有候选键也具有属性的值,即其属性的值"可以唯一地标识表中的记录".事实上,他们**将会做到这一点.所以这不是区别. (4认同)

nvo*_*gel 9

没有区别.主键是候选键.按照惯例,关系中的一个候选键通常被选择为"主要"键,但选择基本上是任意的,并且对于数据库用户/设计者/开发者来说是方便的.它不会使"主要"密钥与任何其他候选密钥基本上有任何不同.


小智 6

主键是一种特殊的索引,其中:

there can be only one;
it cannot be nullable
it must be unique.
Run Code Online (Sandbox Code Playgroud)

候选键是从超级键集中选择的,选择候选键时,我们唯一要注意的是:它不应具有任何冗余属性。

雇员表的示例:雇员(雇员ID,全名,SSN,DeptID)

  1. 候选键:是表中符合所有行唯一性的各个列。在Employee表中,EmployeeID&SSN是候选键。

  2. 主键:您选择用来保持表中唯一性的列。在Employee表中,您可以选择EmployeeID或SSN列,EmployeeID是首选,因为SSN是安全值。

  3. 备用键:主列以外的候选列,例如,如果EmployeeID为PK,则SSN将为备用键。

  4. 超级键:如果您将其他任何列/属性添加到主键,则它将成为超级键,例如EmployeeID + FullName,是超级键。

  5. 复合键:如果表没有单个列符合候选键的条件,则必须选择2列或更多列以使行唯一。就像没有EmployeeID或SSN列一样,您可以将FullName + DateOfBirth用作复合主键。但是,重复行的机会很小。