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

时间:2012-10-10 06:36:31

标签: sql relational-database

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

12 个答案:

答案 0 :(得分:83)

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

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

<强> More on this link with example

答案 1 :(得分:20)

John Woo的回答是正确的,就此而言。以下是其他几点。

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

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

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

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

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

答案 2 :(得分:10)

主键 - &gt;在表中唯一标识记录的任何列或列集都是主键。 (表格中只能有一个主键

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

答案 3 :(得分:9)

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

答案 4 :(得分:4)

主键是一种特殊的索引:

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

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

Employee表的示例: 员工( 员工ID, 全名, SSN, DEPTID )

  1. 候选键:表中的各列符合所有行的唯一性。这里是Employee表EmployeeID&amp; SSN是候选密钥。

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

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

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

  5. 复合键:如果某个表没有符合Candidate键的单个列,则必须选择2个或更多列才能使行唯一。就像没有EmployeeID或SSN列一样,您可以将FullName + DateOfBirth设为Composite主键。但仍然存在重复行的可能性很小。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

想想一张带有整数主键的车辆表。

注册号将是候选键。

在现实世界中,注册号码是主题变化,因此它在某种程度上取决于可能有​​资格作为候选键的情况。

答案 7 :(得分:0)

  

主键

     
    

表的主键是用作该表中行的唯一标识的列(或列的组合)。换句话说,表中的两个不同的行可能永远不会在其主键中具有相同的值,并且对于表中的每一行,主键必须始终具有一个值。后者意味着主值中不允许使用空值键。

         

我们到处都遇到过主键。例如,银行存储有关银行帐户的数据的表格具有列银行帐号作为主键。类似地,其中注册了不同汽车的表使用牌照作为主键

         

enter image description here

  
           

候选人密钥

     
    

某些表包含多个可以充当主键的列(或列组合)。这些列都具有主键的唯一性。此处,也不允许使用空值。这些列称为候选键。但是,只有一个被指定为主键。因此,表始终具有至少一个候选键。

         

如果我们假设护照号码也包含在俱乐部的PLAYERS表中,则该列将用作候选键,因为护照号码是唯一的。两名球员永远不会拥有相同的护照号码。此列也可以指定为主键。

  
           

替代密钥

     
    

不是表的主键的候选键称为备用键。零     或者可以为特定表定义更多备用密钥。候选键一词是     所有主键和备用键的通用术语。

  
           

外键

     
    

外键是表中填充的列(或列的组合)     是表的主键的总体的子集(这没有     成为另一张桌子)。外键有时称为引用键。

  

答案 8 :(得分:-1)

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

CUSTOMERS


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

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

主键列中的值对于每一行必须是唯一的:不能容忍重复项。此外,主键列中不允许使用空值。

因此,在告诉您可以使用一个或多个列作为主键之后,您如何确定选择哪些列(以及多少列)?

有时,使用多列是可取的或必要的。但是,如果您无法立即看到使用多个列的原因,请使用一个。这不是一个绝对的规则,它只是建议。但是,由单列组成的主键通常更易于维护并且操作更快。这意味着如果查询数据库,如果表具有单列主键,通常会更快地得到答案。

下一个问题 - 您应该选择哪一栏?选择列作为主键(以及一种合理使用的方法)的最简单方法是让数据库本身自动为每一行分配一个唯一的数字。

在员工表中,显然任何像FirstName这样的列都是不好的选择,因为你无法控制员工的名字。通常,主键只有一个选择,如上面的情况。但是,如果有多个,则可以将这些描述为“候选键” - 该名称反映出它们是主键负责任的候选者。

答案 9 :(得分:-1)

如果superkey是一个大集合,那么候选键是大集合中的一些较小集合,主键是候选键集中的任何一个元素(一次一个或一个表)。

答案 10 :(得分:-1)

首先你必须知道什么是决定因素? 行列式是用于确定同一表中另一个属性的属性。 SO 决定因素必须是候选键。而且你可以拥有多个决定因素。 但主键用于确定整个记录,您只能拥有一个主键。 主键和候选键都可以包含一个或多个属性

答案 11 :(得分:-1)

主键->任何可以唯一标识表中记录的列或一组列都是主键。 (表中只能有一个主键)和 候选键->与主键相同,但是由数据库管理员的准专家选择(例如,主键是候选键的大小最小)