DBMS 中的主键

DBMS 中的主键定义主键是表中唯一标识该表中元组(行)的一组最小属性(列)。

DBMS 中的主键示例

让我们举一个例子来理解主键的概念。在下表中,有三个属性:Stu_IDStu_NameStu_Age。在这三个属性中,一个属性或一组多个属性可以是主键。

单个属性Stu_Name不能是主键,因为多个学生可以拥有相同的名称。

单个属性Stu_Age不能成为主键,因为不止一个学生可以拥有相同的年龄。

单个属性Stu_Id是主键,因为每个学生都有一个唯一的 ID,可以识别表中的学生记录。

注意:在某些情况下,单个属性不能唯一地标识表中的记录,在这种情况下,我们尝试查找可以唯一标识表中的行的一组属性。在这个例子之后我们将看到它的例子。

表名:Student

Stu_Id Stu_Name Stu_Age
101 Steve 23
102 John 24
103 Robert 28
104 Steve 29
105 Carl 29

有关主键的注意事项

  • 我们通常用下划线表示属性名称(列名)。
  • 对于表的每一行,主键的值应该是唯一的。生成键的列不能包含重复值。
  • 标记为主键的属性不允许具有空值。
  • 主键不一定是单个属性(列)。它可以是一组多个属性(列)。例如{Stu_Id, Stu_Name}可以共同识别上表中的元组,但是我们不选择它作为主键,因为单独Stu_Id就足以唯一地标识表中的行而我们总是去最小的集合。话虽如此,只有当没有可以唯一标识表中的元组的单个列时,我们才应该选择多个列作为主键。

主键的另一个示例 – 多个属性

考虑这个表ORDER,该表保存了客户购买的每日记录。该表有三个属性:Customer_IDProduct_IDOrder_Quantity

Customer_ID单独不能成为主键,因为单个客户可以下多个订单,因此多于一行拥有相同的Customer_ID值。正如我们在以下示例中看到的那样,客户 ID 1011 已经为产品(如果是 9023 和 9111)下了两个订单。

单独Product_ID不能成为主键,因为不止一个客户可以为同一产品下订单,因此多个行具有相同的产品 ID。在下表中,客户 ID 1011 和 1122 为同一产品(产品编号 9023)下订单。

单独使用Order_Quantity不能成为主键,因为不止一个客户可以让订单具有相同的数量。

由于没有一个属性能够成为主键,因此我们尝试创建一组属性作为主键。

{Customer_ID, Product_ID}一起可以在表中唯一地标识行,因此该集合是该表的主键。

表名:ORDER

Customer_ID Product_ID Order_Quantity
1011 9023 10
1122 9023 15
1099 9031 20
1177 9031 18
1011 9111 50

注意:在为主键选择一组属性时,我们总是选择具有最小属性数的最小集合。例如,如果有两个集合可以标识表中的行,则应选择具有最小属性数的集合作为主键。

如何在 RDBMS 中定义主键?

在上面的示例中,我们已经有了一个包含数据的表,我们试图了解主键的用途和含义,但是您应该知道通常我们在创建表时定义主键。我们也可以稍后定义主键,但在现实场景中很少发生。

假设我们要创建上面讨论过的表,其中客户 ID 和产品 ID 设置为主键。我们可以在 SQL 中这样做:

Create table ORDER
(
    Customer_ID int not null,
    Product_ID int not null,
    Order_Quantity int not null,
    Primary key (Customer_ID, Product_ID)
)

假设我们在创建表时没有定义主键,那么我们可以在以后定义它:

ALTER TABLE ORDER
ADD CONSTRAINT PK_Order PRIMARY KEY (Customer_ID, Product_ID);

另一种方式:

当我们只有一个属性作为主键时,就像我们在STUDENT表的第一个例子中看到的那样。我们也可以像这样定义键:

Create table STUDENT
(
    Stu_Id int primary key,
    Stu_Name varchar(255) not null,
    Stu_Age int not null
)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程