2.2.3 代理键
代理键是具有DBMS分配的***标识符的列,该标识符已经作为主键添加到表中。每次创建行时由DBMS分配代理键的***值,该值永远不变。
理想的主键是较短的数字值,并且永远不变。有时,表中的某一列可能满足或接近满足这些需求,例如EMPLOYEE表中的EmployeeNumber就是很好的主键。但在其他表中,主键并不完全满足这些需求。考虑如下的表PROPERTY:PROPERTY (Street, City, State, ZIP, OwnerID)
PROPERTY的主键是(Street, City, State, ZIP),它较长且不是数字(尽管它可能不会改变),但它不是理想的主键。此时,数据库设计人员将添加代理键如PropertyID:PROPERTY (PropertyID, Street, City, State, ZIP, OwnerID)
代理键是较短的数字,并且永远不变-- 是理想的主键。代理主键的值对于用户没有任何意义,因此通常在表单或报表中隐藏它们。
在前面讨论的数据库中已经使用了代理键。例如在如图1-10所示的艺术课程数据库中,向CUSTOMER表添加了CustomerNumber代理键,而向COURSE表添加了CourseNumber代理键。
大部分DBMS产品都提供了自动产生键值的功能。图2-7显示了如何在Access 2010中是定义代理键。在Access中,数据类型设置为AutoNumber。有了这一设置,Access就指定CUSTOMER表中***行的CustomerNumber值为1,第二行的CustomerNumber值为2,依此类推。
企业级DBMS产品(例如Microsoft的SQL Server)提供了更多的功能。例如,开发人员可以利用SQL Server确定代理键的初始值和递增量。图2-8显示了如何定义CUSTOMER表的代理键CustomerNumber。在dbo.CUSTOMER表列细节窗口下方的Column Properties(列属性)窗口中,有一组Identity说明,它们告诉SQL Server存在代理键列。CustomerNumber的is Identity值设置为Yes,就把CustomerNumber设置为代理键。代理键的起始值叫做identity seed。对于CustomerNumber,该值设置为1。另外,代理键每次增长的值称为identity increment,这里设为1。这些设置表示,用户创建CUSTOMER表的***行时,SQL Server会将值1赋给CustomerNumber;创建CUSTOMER的第二行时,SQL Server会将值2赋给CustomerNumber,依此类推。
MySQL使用AUTO_INCREMENT函数自动分配代理键的数值。在AUTO_ INCREMENT中,起始值可以是任意值(默认为1),但增量总是1。图2-9显示,CustomerNumber是CUSTOMER的代理键,它使用AUTO_INCREMENT设置该列的值。
【责任编辑:云霞 TEL:(010)68476606】
点赞 0