利用Oracle数据库表完整性功能提高数据输入准确率(二)
2008-06-11 12:42:55 来源:WEB开发网二、参照完整性。
在一般的管理系统中,无论是小小的考勤系统,还是大的ERP系统,一般都会包含两张表。一张是员工信息表,一张是部门信息表。如下表所示:
员工信息表
员工编号 | 性别 | 部门 |
SA001 | 男 | 销售 |
SA002 | 男 | 销售 |
PR001 | 男 | 采购 |
部门信息表
部门编号 | 部门名称 |
SA | 销售 |
SA | 销售 |
PR | 采购 |
现在我们希望,在员工信息表处定义的部门信息必须存在与部门信息表中。也就是说,当部门信息表中没有定义这个部门的话,在员工信息表中将部门输入这个部门。如在部门信息表里,我们没有输入研发部门,此时,在员工信息表中,我们若把一个员工归属于研发部门的话,则系统要能够提示错误信息,告诉用户这个部门还没有定义,需要先定义该部门信息。
这个需求就是要通过参照完整性来实现。参照完整性是指互相关联的两个表之间的约束,具体的说,就是从表中每条记录外键的值必须是主表中所存在的。因此,如果在两个表之间建立了关联关系,则对一个表进行的操作要影响到另一个表中的记录。下面,我结合具体的实例,讲述一下参照完整性的具体实现方式及需要注意的地方。
1、 建立部门信息表。
表建立完成以后,给部门信息表中插入销售与采购两条记录。
技巧说明:当我们利用语句给一个表中插入记录的时候,如果表中有两个字段,我们给这两个字段都赋值的话,则在插入语句中,可以不写字段的名称。但是,若插入一条记录的时候,一条记录的某个字段没有赋值的话,则要注意一定要按赋值的顺序把字段名一一写清楚。
2、 建立员工信息表,先不设置外键,看效果如何。
下面,我们给员工信息表插入一条记录,部门为研发部门(AD)。该部门信息在部门信息表中不存在。在没有建立参照完整性的条件下,数据库将不会提示任何的错误。
3、 给员工信息表实现参照完整性功能,给其部门字段设置外键。
从上面的记录中可以看到,不设置外键的情况下,即使部门信息表中没有这个部门信息,但是,在员工信息表中仍然可以把员工归属于“研发”部门。这在实际管理中,肯定会出乱子。所以,我们希望当部门信息表中没有研发部门的部门信息时,员工信息表中就也不能出现这个部门。
我们先个员工信息表的部门字段定义一个外键。
如图所示,当员工信息表中已经有记录,并且,该记录的部门编号不存在与部门信息表中,在建立主键的时候,就会产生错误信息,提示此列列表的唯一或主键不匹配。我先把该条记录的部门信息更新一下,然后再建立主键。
这里要注意一个问题,就是主表中的某个字段如果要被其他表设置为外键的话,则这个字段要先设置为主键,否则在建立外键的时候,会报错。
4、 给员工信息表插入记录,部门字段不在部门信息表中,系统提示错误信息。
如上图所示,没有建立主键的员工信息表可以顺利插入数据,但是,在下面已经建立了外键的表中的话,插入记录的话,会提示错误信息“违反完整约束条件,未找到父项关键字”。
5、 在参完整性的设计中,需要注意的几个方面。
一是外键的取名规则。虽然在Oracle数据库中,没有对外键的取名有特殊的强制性要求,只要满足普通的命名规则即可,如不能使用Oracle数据库本身的关键字进行命名或者名字不能以数字开头,除此之外,没有强制性的要求。系统虽然没有强制性要求,但是,作为一个好的数据库开发人员,要养成一个好的命名习惯。如按照我们一般的命名习惯,外键约束取名以FK开头,并用下划线与名字进行分开;名字一般是以字段名进行定义。如上面给员工信息表的部门字段设置外键的话,去外键就取名为FK_DEP。如此的话,以后我们维护这些完整性功能的话,一看约束名字,就知道这个约束是参照完整性约束,其是作用在部门这个字段上。这个命名的另外一个好处,就是方便其他开发人查询。现在的数据库管理系统一般一个人很难完成,都是需要通过一个团队才可以实现。所以,我们在设计数据库的时候,不仅我们自己要能够看懂我们去的名字,而且,其他开发人员也需要能够一目了然的知道这个名字的意思。不仅外键定义是如此,我们上面所说的主键的定义,及后面将要讲到的CHECK约束,都是类似的道理。
二是参照完整性约束中,一般把两张表叫做主表与从表。主表就是被参考的表,就是上面例子中所讲的“部门信息表”,而从表就是“员工信息表”。在设计参照完整性功能的时候,我们要注意的的是,主表中被参考的字段与从表中被定义为外键的字段,无论是数据类型还是数据的长度都必须一致。否则的话,容易产生错误。这也是一种数据库开发的良好习惯。
三是一单主表中的某个字段被其他表作为外键的话,则这个表的修改与删除就会收到限制。一般情况下,这个被其他表引用了的字段将不能被删除或者修改。用户强行删除的话,系统会提示该表已经有子记录。当然,也可以通过“级联修改”或者“级联删除”实现这个功能。级联修改是指主表中字段内容修改了,则从表中对应的内容也发生改变,如当采购部门名称改为物流部门的话,则在员工信息表中的采购部门也会自动改为物流部门;级联删除也是类似的道理,到主表中的记录被删除的话,从表中的记录也将被删除,当我把部门信息表中的采购部门这条记录删除之后,员工信息表中的所有采购部门的员工记录也将被删除。但是,很明显,这么操作的话,比较危险。所以,笔者一般都不建议如此操作。关于这个级联修改及级联删除功能或后续还会详细介绍。
赞助商链接