建立一个新的学生信息表,即表Student2:
Sno | Sname | Ssex | Sage | Sdept |
S01 | 王建平 | 男 | 21 | 自动化 |
S02 | 刘华 | 女 | 19 | 电子 |
S03 | 范林军 | 女 | 18 | 电子 |
S04 | 李伟 | 男 | 19 | 计算机 |
S05 | 赵健 | 男 | 18 | 数学 |
S06 | 黄玲 | 女 | 20 | 数学 |
S07 | 李伟 | 男 | 18 | 数学 |
表2. Student2
表Student2与表Student不同的是,出现了两位叫李伟的同学,分别来自计算机系和数学系。这样一来,Sname这个字段就不能唯一地标识表中的一条记录。虽然两人都叫李伟,但是两人的学号Sno不同,字段Sno仍然能唯一标识每条记录,该字段就可以作为表Student2的主键。
主键的定义:数据表中的一条记录有若干个字段,若其中某个字段组(注意是组)能唯一标识一条记录,该字段组就可以成为一个主键。主键的选择是由任意性的,凡是满足上述条件的都可以被选作主键,但是在一个表中最多只能有一个主键。
比如:
表Student2(Sno,Sname,Ssex,Sage,Sdept)
其中每个学生的学号Sno是唯一的,Sno就可以是一个主键;
课程表(课程编号,课程名,学分)
其中课程编号是唯一的,课程编号就可以是一个主键;
成绩表(学号,课程号,成绩)
成绩表中单一一个字段无法唯一标识一条记录,因为存在着多个学生选一门课和一个学生选多门课的情况。因此学号和课程号的组合才可以唯一标识一条记录,所以说学号和课程号的字段组可以是一个主键。
主键的意义:主要在于维护数据的完整性。由于主键能唯一标识一条记录,在数据的录入和管理过程中就不会因为字段值的重复而导致某些记录的数据丢失(例如重名的情况下只录入了一个人的数据)。此外,合理地设置主键可以使数据表条理清楚,加快数据库的操作速度。
正是因为主键有这样的作用,建立主键时应该遵循一定的原则:
1. 主键的值不可重复,也不可为空(NULL);
2. 一个表中只能有一个主键。
虽然将由若干个字段组成的字段组作为主键也是允许的,即所谓的复合主键。但是实际应用中往往需要使用单一主键,即用单一的字段来标识每条记录。当使用SQL语句对表内数据进行查询更新等操作时,可以看出,使用复合主键时SQL语句更复杂。仍以表Student2为例,假设学号为S05的赵健同学从数学系转到计算机系,需要更新表中的数据。
如果采用字段组Sname、Ssex和Sage作复合主键,SQL语句如下:
UPDATE Student2 set Sdept=”计算机” WHERE Sname=”赵健” AND Ssex=”男” AND Sage=”18”;
如果采用字段Sno作单一主键,SQL语句如下:
UPDATE Student2 set Sdept=”计算机” WHERE Sno=”S05”;
上述语句作用相同,显然使用复合主键SQL语句更加复杂,而这种复杂度完全可以通过使用单一主键来避免。
另外,当操作涉及多个相互关联的表时,采用复合主键SQL语句将会更加复杂,而且表间关系也会更混乱,学过下一节表关联,相信大家对这一点会有更深的体会。有兴趣的读者可以在学过表关联之后尝试一下采用复合主键的表关联。