52

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

4

11 回答 11

96

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

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

更多关于这个链接的例子

于 2012-10-10T06:37:49.570 回答
22

就目前而言,吴宇森的回答是正确的。这里还有几点。

主键始终是候选键之一。很多时候,它是唯一的候选人。

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

如果没有主键的概念,关系模型将是完整的。它不在关系模型的原始表示中。实际上,在没有声明主键的情况下使用外键引用会导致混乱。这可能是一个逻辑上正确的混乱,但它仍然是一个混乱。声明主键可以让 DBMS 帮助您执行数据规则。大多数时候,让 DBMS 帮助您执行数据规则是一件好事,而且值得付出代价。

一些数据库设计人员和一些用户对于主键是标识表中的行(记录)还是标识表所代表的主题中的实体实例存在一些心理困惑。在理想的世界中,它应该两者都做,并且实体表中的行和相应实体的实例之间应该存在一一对应的关系。

在现实世界中,事情变得一团糟。有人两次输入同一个新员工,员工最终有两个 id。有人被录用,但数据输入在一些手动过程中漏掉了,员工没有得到身份证,直到遗漏得到纠正。一个在第一次出现问题时不会崩溃的数据库比一个数据库更健壮。

于 2012-10-10T11:13:09.190 回答
12

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

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

于 2012-10-10T07:04:54.870 回答
10

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

于 2012-10-10T08:33:47.827 回答
9

主键是一种特殊的索引:

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

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

员工表示例:员工(员工 ID、FullName、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 作为复合主键。但是,重复行的可能性很小。

于 2017-11-16T23:24:35.757 回答
1

一个表可以有这么多可以唯一标识一行的列。这些列被称为候选键,但主键应该是其中之一,因为一个主键对于一张表来说就足够了。因此,在众多候选键中,主键的选择非常重要。这就是主要区别。

于 2014-01-10T04:32:02.977 回答
0

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

注册号将是候选键。

在现实世界中,注册号会发生变化,因此在某种程度上取决于可能有​​资格成为候选密钥的情况。

于 2012-10-10T08:01:30.170 回答
0

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

于 2019-04-14T13:16:12.277 回答
-1

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

CUSTOMERS


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

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

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

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

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

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

在员工表中,显然任何像 FirstName 这样的列都是一个糟糕的选择,因为您无法控制员工的名字。主键通常只有一个选择,如上例所示。但是,如果有多个,则可以将它们描述为“候选键”——名称反映了它们是负责主键工作的候选者。

于 2014-02-23T08:57:07.283 回答
-1

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

于 2015-11-30T19:55:42.710 回答
-1

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

于 2017-02-08T11:18:29.387 回答