为SQL Server 表定义主键
数据库技术
在SQL Server表中设定主键是一项常见的工作,在讲述这个问题之前,先让我们来认识一下什么是主键。
主键(Primary Key),也称为主键约束。它是用来实现实体完整性及主表与子表的关联性连接。通俗地讲,如果大家手头有一个常见的学生成绩表,那么其中学号这个字段就可以设定为主键,它本身又是唯一的,可方便大家通过它对信息进行相应的检索。
在SQL Server 2000 的表中,可以将单一字段或多个字段的组合定义为主键,这些字段不接受空值和重复值。因此,一旦为这些字段定义了主键,今后在添加或修改数据时,若发生在主键的源字段添加或修改后的值与其他现存的数据发生重复时,SQL Server 2000将提示该操作违反唯一性,从而取消这项添加或修改操作,确保了数据的唯一性和准确性。另外,主键的另一个功能,就是在关联性连接中,父表将通过主键与其他子表的外键(Foreign Key)创建关联性。以下的示例主要针对“唯一性”问题来说明。
例:在学生管理系统中,学生数据库可包含基本信息表、课程表和成绩表。若将基本信息表中的“学号”字段作为主键,则除了确保学生信息的唯一性外,还可以连接基本信息表和课程表、成绩表,使得主表(基本信息表)中的信息与子表(课程表或成绩表)信息相关联。

SQL Server 2000系统在创建主键约束的同时,自动为主键源字段创建唯一性索引。因为要为索引的效率考虑,所以通常选择长度小且内容为整数的字段作为主键源字段。因此,类似于“学号”这样较长(约15至18位)字符类型的字段,并不太适合作为主键字段;另外,实际上也比较少用学号来进行操作和管理。
那这样的问题如何解决呢?仍以学生管理系统为例。假定学生信息以班级为单位存储,则可以考虑使用序号来替代学号。学生基本信息表的结构如表所示。
每一“序号”值对应一个学生,因此用短小的“序号”来操作数据是比较方便的。由于学生的序号值会发生改变(如:某学生中途辍学),所以该班部分学生的序号需要重新调整。如果使用“直接修改”方式来读写数据库中的数据,则可直接修改。但如果是使用批量更新处理数据(如:Delphi中使用ADO的TADODataSet等控件来实现批量更新处理),则不能同时修改互换两个或多个记录的“序号”值,否则系统提示出错。例如,将原来“序号”为1的改为2,将原来“序号”为2的改为1,就会遭到系统的拒绝(但可以按先后修改保存来完成)。基于这样的原因,就必须重新考虑主键字段了。实际上,此时可将“序号”与“姓名”组合后定义为主键,便可以防止这类操作的错误。
以上只是通过一个实例来说明制定“主键”并非所想象的那么简单,通常要考虑各种因素,或表的结构,或访问处理数据的方式,或编程的需要等。希望初学者在初步掌握了主键的概念后要特别注意在实际工作中的应用。