在对表、行和列的理解之上,我们知道表存储数据,其中每行代表一个单独的条目或记录(例如特定的客户、产品或订单),每列代表该条目的一个属性或特性(例如姓名、价格或订单日期)。现在,想象一个包含数千甚至数百万行数据的表。如果您需要查找、更新或删除某特定行,如何确保操作的是正确的行?如果多个客户同名,或者几种产品价格相同,怎么办?我们需要一种可靠的方法来精确找到唯一的一行。这时,主键就发挥作用了。主键是用于唯一标识表中每一行的列,有时也可以是多列的组合。可以把它看作是每条记录的唯一标识号。正如没有两个公民会拥有相同的社会安全号码一样,表中也没有两行可以拥有相同的主键值。主键的主要特性主键具有由数据库管理系统(DBMS)强制执行的两个基本属性:唯一性: 主键列(或列组合)中的每个值必须是唯一的。如果插入新行或更新现有行会导致主键值重复,DBMS会阻止此操作。这确保了每行都有一个不同的标识符。非空: 主键列不能包含NULL值。NULL代表未知或缺失的值。由于主键的目的是唯一标识一行,它必须对每一行都有一个确定的值。您不能用一个“未知”的标识符来识别事物。主键为何重要?使用主键有以下多项显著优点:唯一标识: 这是它们的主要用途。它们提供一种确保引用到特定行的方法,消除歧义。这对于准确检索、修改或删除数据很必要。例如,如果您想更新客户'John Smith'的电子邮件地址,如果有多个同名客户,您需要确保更新的是正确的'John Smith'。使用唯一的CustomerID主键可确保准确性。建立关联: 主键是将不同表中的相关数据关联起来的重要方式。我们将在下一节看到,一个表的主键如何用于另一个表(作为外键)来建立连接,从而构成关系型数据库的结构。数据完整性: 通过强制唯一性,主键可以防止意外插入重复记录,有助于数据的整体准确性和可靠性。性能: DBMS通常会使用主键自动创建索引。索引就像书后的索引;它帮助数据库更快地找到特定行,而无需扫描整个表。选择合适的主键设计表时,您需要确定哪些列将作为主键。通常有两种方法:自然键: 这些列本身就是数据的一部分,并天然具备唯一性和非空的属性(或预期具备)。例如:Books表中的ISBN(国际标准书号)。Users表中的UserEmail(假设电子邮件地址必须唯一)。Products表中的ProductSKU(库存单位)。虽然自然键可以很直观,但它们有时也有缺点。如果组织更改了SKU格式怎么办?如果用户需要更改电子邮件地址怎么办?更改主键值可能很复杂,因为它可能用于关联其他表。此外,一些自然标识符可能包含敏感信息(如政府身份证号码),或者不能保证永远唯一。代理键(或人工键): 这些列是专门添加到表中用作主键的,除了标识行之外没有固有含义。最常见的类型是自动递增的整数。当添加新行时,数据库会自动为该列分配下一个递增的整数值(例如1、2、3等)。例如CustomerID、ProductID、OrderID。代理键通常更受青睐,原因如下:它们保证唯一且非空。它们是稳定的;即使行中的其他数据发生变化,也无需更改。它们通常是简单的数据类型(如整数),便于数据库处理和索引,效率高。它们不带有任何业务含义,减少业务规则变化带来的影响。我们通过一个简单的Products表示例来直观了解:digraph G { rankdir=LR; node [shape=plaintext]; products [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0"> <TR><TD COLSPAN="4" BGCOLOR="#a5d8ff">产品</TD></TR> <TR> <TD BGCOLOR="#e9ecef"><B>产品ID (主键)</B></TD> <TD>产品名称</TD> <TD>类别</TD> <TD>价格</TD> </TR> <TR><TD>101</TD><TD>无线鼠标</TD><TD>电子产品</TD><TD>25.99</TD></TR> <TR><TD>102</TD><TD>USB键盘</TD><TD>电子产品</TD><TD>45.50</TD></TR> <TR><TD>103</TD><TD>咖啡杯</TD><TD>家居用品</TD><TD>12.00</TD></TR> <TR><TD>104</TD><TD>笔记本</TD><TD>文具</TD><TD>3.75</TD></TR> <TR><TD>105</TD><TD>无线鼠标</TD><TD>配件</TD><TD>29.99</TD></TR> </TABLE> >]; }一个简单的Products表,使用ProductID作为代理主键(PK)。请注意,尽管“无线鼠标”出现两次,但每行都可以通过其ProductID唯一标识。在此示例中,ProductID是一个代理键。它唯一标识每条产品行。即使我们有两个同名为“无线鼠标”的不同产品,它们的ProductID值(101和105)也不同,使我们能够区分它们。尝试插入另一个ProductID为101的产品将导致DBMS报错。复合主键有时,单列不足以唯一标识一行。在这种情况下,您可以定义复合主键,它由两个或多个列组合而成。这些列中值的组合对于每行必须是唯一的。例如,考虑一个存储客户订单中条目的表,例如名为OrderItems的表。单个OrderID不会是唯一的(一个订单可以有多个条目),单个ProductID也不会是唯一的(一个产品可以出现在多个订单中)。然而,OrderID和ProductID的组合很可能是唯一的 —— 通常您不会在同一个订单项中两次列出完全相同的产品。因此,(OrderID, ProductID)可以作为OrderItems表的复合主键。在本入门课程中,我们主要关注单列主键,但了解复合主键在更复杂情况下存在是有益的。总而言之,主键是关系型数据库中的一个基本概念。它强制每行的唯一性,提供一种可靠的方法来标识特定记录,并在关联不同表中的相关数据方面发挥重要作用,我们将在接下来讨论外键时进一步说明。