趋近智
在对表、行和列的理解之上,我们知道表存储数据,其中每行代表一个单独的条目或记录(例如特定的客户、产品或订单),每列代表该条目的一个属性或特性(例如姓名、价格或订单日期)。
现在,想象一个包含数千甚至数百万行数据的表。如果您需要查找、更新或删除某特定行,如何确保操作的是正确的行?如果多个客户同名,或者几种产品价格相同,怎么办?我们需要一种可靠的方法来精确找到唯一的一行。
这时,主键就发挥作用了。主键是用于唯一标识表中每一行的列,有时也可以是多列的组合。可以把它看作是每条记录的唯一标识号。正如没有两个公民会拥有相同的社会安全号码一样,表中也没有两行可以拥有相同的主键值。
主键具有由数据库管理系统(DBMS)强制执行的两个基本属性:
NULL值。NULL代表未知或缺失的值。由于主键的目的是唯一标识一行,它必须对每一行都有一个确定的值。您不能用一个“未知”的标识符来识别事物。使用主键有以下多项显著优点:
CustomerID主键可确保准确性。设计表时,您需要确定哪些列将作为主键。通常有两种方法:
自然键: 这些列本身就是数据的一部分,并天然具备唯一性和非空的属性(或预期具备)。例如:
Books表中的ISBN(国际标准书号)。Users表中的UserEmail(假设电子邮件地址必须唯一)。Products表中的ProductSKU(库存单位)。虽然自然键可以很直观,但它们有时也有缺点。如果组织更改了SKU格式怎么办?如果用户需要更改电子邮件地址怎么办?更改主键值可能很复杂,因为它可能用于关联其他表。此外,一些自然标识符可能包含敏感信息(如政府身份证号码),或者不能保证永远唯一。
代理键(或人工键): 这些列是专门添加到表中用作主键的,除了标识行之外没有固有含义。最常见的类型是自动递增的整数。当添加新行时,数据库会自动为该列分配下一个递增的整数值(例如1、2、3等)。例如CustomerID、ProductID、OrderID。
代理键通常更受青睐,原因如下:
我们通过一个简单的Products表示例来直观了解:
一个简单的
Products表,使用ProductID作为代理主键(PK)。请注意,尽管“无线鼠标”出现两次,但每行都可以通过其ProductID唯一标识。
在此示例中,ProductID是一个代理键。它唯一标识每条产品行。即使我们有两个同名为“无线鼠标”的不同产品,它们的ProductID值(101和105)也不同,使我们能够区分它们。尝试插入另一个ProductID为101的产品将导致DBMS报错。
有时,单列不足以唯一标识一行。在这种情况下,您可以定义复合主键,它由两个或多个列组合而成。这些列中值的组合对于每行必须是唯一的。
例如,考虑一个存储客户订单中条目的表,例如名为OrderItems的表。单个OrderID不会是唯一的(一个订单可以有多个条目),单个ProductID也不会是唯一的(一个产品可以出现在多个订单中)。然而,OrderID和ProductID的组合很可能是唯一的 —— 通常您不会在同一个订单项中两次列出完全相同的产品。因此,(OrderID, ProductID)可以作为OrderItems表的复合主键。
在本入门课程中,我们主要关注单列主键,但了解复合主键在更复杂情况下存在是有益的。
总而言之,主键是关系型数据库中的一个基本概念。它强制每行的唯一性,提供一种可靠的方法来标识特定记录,并在关联不同表中的相关数据方面发挥重要作用,我们将在接下来讨论外键时进一步说明。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造