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

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

Candidate Key – 候选键可以是任何列或列的组合,可以作为数据库中的唯一键 。 在一个表中可以有多个候选键。 每个候选键都可以作为主键。

Primary Key – 主键是唯一标识logging的列或列组合。 只有一个候选键可以是主键。

更多关于这个链接的例子

尽pipe如此,吴宇森的回答是正确的。 这里有一些额外的要点。

主键始终是候选键之一。 相当经常,这是唯一的候选人。

没有候选键的表格不代表关系。 如果您使用关系模型来帮助您build立一个好的数据库,那么您devise的每个表将至less有一个候选键。

没有主键的概念,关系模型就是完整的。 这不是关系模型的原始表述。 实际上,使用没有声明主键的外键引用会导致混乱。 这可能是一个逻辑上正确的混乱,但它仍然是一团糟。 声明一个主键让DBMS可以帮助你执行数据规则。 大多数情况下,使用DBMS帮助您执行数据规则是一件好事,而且值得花费。

一些数据库devise人员和一些用户对主键是否标识表中的行(logging)或该表所代表的主题中的实体实例有一些疑虑。 在一个理想的世界中,它应该同时做到这一点,实体表中的行与相应实体的实例之间应该存在一对一的对应关系。

在现实世界中,事情搞砸了。 有人两次进入同一个新员工,员工最后有两个ID。 有人被录用,但数据input在某些人工stream程中滑过了裂缝,员工没有得到一个ID,直到纠正遗漏为止。 第一次崩溃的数据库比第一次崩溃的数据库更强大。

主键 – >可以唯一标识表中的logging的任何列或一组列都是主键。 (表中只能有一个主键

候选键 – >任何成为主键的候选列或列都是候选键。 (表中可以有一个或多个候选键 ,如果只有一个候选键,则可以select为主键)

没有区别。 主键是候选键。 按照惯例,关系中的一个候选键通常被select为“主要”键,但是select本质上是任意的,并且是数据库用户/devise者/开发者的便利的问题。 它不会使任何其他候选键的“主键”根本上不同。

1)在关系数据库(如Oracle,MySQL,Sybase或MSSQL)的表中可以有多个候选键,但只允许一个主键。

2)主键和候选键的一个例子可以是Employee表中的IDSSN号,因为两者都可以唯一地标识每个雇员,他们是候选键,任何一个都可以成为主键。 现在,如果你不得不select它们作为主键,那么我将把ID作为主键,因为SSN是敏感信息,在查询中可能不象ID那样被允许/不安全地用作string。 selectSSN作为主键的第二个原因是可以将ID用作组织内的主要跟踪ID ,并且在整个地方频繁使用。 一旦你select了主键,所有的候选键就像唯一的键。

这就是表中的主键和候选键之间的区别。 如果你对选举的理解比你认为的主键在所有候选键中当选成员都要好。

主键是一种特殊的索引:

 there can be only one; it cannot be nullable it must be unique. 

候选键是从一组超级键中select的,在select候选键时唯一要注意的是:它不应该有任何多余的属性。

Employee表的示例:Employee(Employee ID,FullName,SSN,DeptID)

  1. 候选键(Candidate Key):表格中的单个列,符合所有行的唯一性。 Employee表中EmployeeID和SSN是候选键。

  2. 主键:是您select维护表中唯一性的列。 在Employee表中,您可以selectEmployeeID或SSN列,EmployeeID是首选,因为SSN是一个安全值。

  3. 备用密钥:其他主列的候选列,如果EmployeeID是PK,则SSN将是备用密钥。

  4. 超级键:如果你添加任何其他列/属性到主键然后它成为一个超级键,像EmployeeID + FullName是一个超级键。

  5. 复合关键字:如果一个表具有符合候选关键字的单列,则必须select2列或更多列才能使其成为唯一的行。 如果没有EmployeeID或SSN列,那么可以将FullName + DateOfBirth作为复合主键。 但是重复排列的机会还是很小的。

一个表可以有很多列可以唯一地标识一行。 这个列被称为候选键 ,但主键应该是其中之一,因为一个主键足够用于表。 所以在这么多的候选键中select主键是非常重要的。 这是主要的区别。

考虑一个整数主键的车辆表。

注册号码将成为候选密钥。

在现实世界中,注册号码是主题变化的,所以它在某种程度上取决于什么情况可能有资格作为候选密钥。

主键是表中的一列(或多列),用于唯一标识该表中的行。

 CUSTOMERS CustomerNo FirstName LastName 1 Sally Thompson 2 Sally Henderson 3 Harry Henderson 4 Sandra Wellington 

例如,在上表中,CustomerNo是主键。

主键列中的值必须对每行都是唯一的:不能容忍重复。 另外,主键列中不允许有空值。

所以,告诉过你可以使用一列或多列作为主键,你如何决定select哪一列(以及多less)?

那么有些时候,build议或必须使用多个色谱柱。 但是,如果您不能立即看到使用多个列的原因,请使用一个。 这不是一个绝对的规则,它只是build议。 但是,由单列组成的主键通常更容易维护,运行速度更快。 这意味着如果您查询数据库,如果表具有单列主键,则通常会更快地得到答案。

下一个问题 – 你应该select哪一列? select列作为主键(以及合理常用的方法)的最简单方法是让数据库本身自动为每一行分配一个唯一的数字。

在一张雇员表中,显然像FirstName这样的列是不好的select,因为你无法控制员工的名字。 像上面的情况一样,主键通常只有一个select。 但是,如果有不止一个,这些可以被称为“候选键” – 这个名称反映了他们是主键负责任的候选人。

如果超级密钥比候选密钥大,那么候选密钥集中的大集合和主关键字中的任何一个元素(一次一个或一个表)。

首先,你必须知道什么是行列式 ? 行列式是用于确定同一个表中的另一个属性的属性。 所以行列式必须是候选键 。 你可以有多个行列式。 但主键用于确定整个logging,并且只能有一个主键。 主键和候选键都可以由一个或多个属性组成