# DBMS 中的超键

> 原文： [https://beginnersbook.com/2015/04/super-key-in-dbms/](https://beginnersbook.com/2015/04/super-key-in-dbms/)

**DBMS 中超键的定义**：超键是一组单个或多个属性（列），可以唯一地标识表中的行。通常 [DBMS 初学者](https://beginnersbook.com/2015/04/dbms-tutorial/)混淆超键和[候选键](https://beginnersbook.com/2015/04/candidate-key-in-dbms/)，因此我们还将在本文中讨论候选键及其与超键的关系。

## 候选键如何与超键不同？

答案很简单 - 从超键集中选择候选键，我们在选择候选键时唯一要注意的是：它不应该有任何冗余属性。这就是他们被称为最小超键的原因。

让我们举一个例子来理解这一点：

**表：`Employee`**

```
Emp_SSN	    Emp_Number	 Emp_Name
---------   ----------   -------- 
123456789	226	 Steve
999999321	227	 Ajeet
888997212	228	 Chaitanya
777778888	229	 Robert

```

**超键**：上表有以下超键。以下所有超键集都能够唯一标识`employee`表的一行。

*   {} Emp_SSN
*   {} Emp_Number
*   {Emp_SSN，Emp_Number}
*   {Emp_SSN，Emp_Name}
*   {Emp_SSN，Emp_Number，Emp_Name}
*   {Emp_Number，Emp_Name}

**候选键**：正如我在开头提到的，候选键是一个没有冗余属性的最小超键。从上述集合中选择以下两组超键，因为这些集合中没有冗余属性。

*   {} Emp_SSN
*   {} Emp_Number

只有这两组是候选键，因为所有其他组都具有冗余属性，这些属性对于唯一标识不是必需的。

## 超键与候选键

关于超键和候选键之间的混淆，我收到了很多评论。让我给你一个清楚的解释。

1. 首先，您必须了解所有候选键都是超键。这是因为候选键是从超键中选择的。

2. 我们如何从超键集中选择候选键？我们寻找那些我们无法删除任何字段的键。在上面的示例中，我们没有选择`{Emp_SSN, Emp_Name}`作为候选键，因为`{Emp_SSN}`单独可以识别表中的唯一行，而`Emp_Name`是冗余的。

[**主键**](https://beginnersbook.com/2015/04/primary-key-in-dbms/)：
从一组候选键中选择主键。这是由数据库管理员或数据库设计者完成的。我们可以说可以选择`{Emp_SSN}`或`{Emp_Number}`作为表`Employee`的主键。