这个问题当时真的不知道怎么回答,只是说Hibernate框架就是这么要求的。后来翻了上学时候的书《数据库系统设计 实现与管理》(第六版)第73页3.3节“表3-4 完整性规则”中要求:
1. 实体完整性
1.1 要求:所有主键标实体都是惟一的,而且主键标的任何部分不可以是空值;
1.2 目的:保证每一个实体会有惟一的标识,并且确保外键标值可以正确的引用主键标值;
1.3 示例:没有发票可以具有重复的编号,也不可以是空值。总之,所有发票由它们的发票编号惟一的标识。
用户发难:人员表中工号是唯一的,为什么不用工号作为主键?
回答:分析了需求后,发现,人员表中工号存在“回收复用”的情况。比如,局长的工号永远都是00001,今年是李局长,明年李局长升迁了、退休了,张局长赴任,工号还是00001。如果用工号作为主键,那么子表引用人员表工号字段,就会出现以下情况:
1、2008年工号为00001的用户操作了100条业务,该工号00001代表李局长;
2、2009年工号为00001的用户操作了80条业务,该工号00001代表张局长。
最后统计工号为00001的用户一共操作了多少业务的时候,会得到工号为00001的张局长操作了180条业务。
因此,工号虽然在库表中唯一,但是他违背了“所有主键标实体都是惟一的”这一完整性要求,因此,不能将工号作为主键。