体育投注站利用Oracle数据库表完整性功能提高数据输入准确率(二

时间:2018-10-26 05:17来源:未知 作者:admin 围观:字体://

  在一般的管理系统中,无论是小小的考勤系统,还是大的ERP系统,一般都会包含两张表。一张是员工信息表,一张是部门信息表。如下表所示:

  现在我们希望,在员工信息表处定义的部门信息必须存在与部门信息表中。也就是说,当部门信息表中没有定义这个部门的话,在员工信息表中将部门输入这个部门。如在部门信息表里,我们没有输入研发部门,此时,在员工信息表中,我们若把一个员工归属于研发部门的话,则系统要能够提示错误信息,告诉用户这个部门还没有定义,需要先定义该部门信息。

  这个需求就是要通过参照完整性来实现。参照完整性是指互相关联的两个表之间的约束,具体的说,就是从表中每条记录外键的值必须是主表中所存在的。因此,如果在两个表之间建立了关联关系,则对一个表进行的操作要影响到另一个表中的记录。下面,我结合具体的实例,讲述一下参照完整性的具体实现方式及需要注意的地方。

  技巧说明:当我们利用语句给一个表中插入记录的时候,如果表中有两个字段,我们给这两个字段都赋值的话,则在插入语句中,可以不写字段的名称。但是,若插入一条记录的时候,一条记录的某个字段没有赋值的话,则要注意一定要按赋值的顺序把字段名一一写清楚。

  下面,我们给员工信息表插入一条记录,部门为研发部门(AD)。该部门信息在部门信息表中不存在。在没有建立参照完整性的条件下,数据库将不会提示任何的错误。

  从上面的记录中可以看到,不设置外键的情况下,即使部门信息表中没有这个部门信息,但是,在员工信息表中仍然可以把员工归属于“研发”部门。这在实际管理中,肯定会出乱子。所以,我们希望当部门信息表中没有研发部门的部门信息时,员工信息表中就也不能出现这个部门。

  如图所示,当员工信息表中已经有记录,并且,该记录的部门编号不存在与部门信息表中,在建立主键的时候,就会产生错误信息,提示此列列表的唯一或主键不匹配。我先把该条记录的部门信息更新一下,然后再建立主键。

  这里要注意一个问题,就是主表中的某个字段如果要被其他表设置为外键的话,则这个字段要先设置为主键,否则在建立外键的时候,会报错。

  4、 给员工信息表插入记录,部门字段不在部门信息表中,系统提示错误信息。

  如上图所示,没有建立主键的员工信息表可以顺利插入数据,但是,在下面已经建立了外键的表中的话,插入记录的话,会提示错误信息“违反完整约束条件,未找到父项关键字”。

  一是外键的取名规则。虽然在Oracle数据库中,没有对外键的取名有特殊的强制性要求,只要满足普通的命名规则即可,如不能使用Oracle数据库本身的关键字进行命名或者名字不能以数字开头,除此之外,没有强制性的要求。系统虽然没有强制性要求,但是,作为一个好的数据库开发人员,要养成一个好的命名习惯。如按照我们一般的命名习惯,外键约束取名以FK开头,并用下划线与名字进行分开;名字一般是以字段名进行定义。如上面给员工信息表的部门字段设置外键的话,去外键就取名为FK_DEP。如此的话,以后我们维护这些完整性功能的话,一看约束名字,就知道这个约束是参照完整性约束,其是作用在部门这个字段上。这个命名的另外一个好处,就是方便其他开发人查询。现在的数据库管理系统一般一个人很难完成,正规的体育投注站都是需要通过一个团队才可以实现。所以,我们在设计数据库的时候,不仅我们自己要能够看懂我们去的名字,而且,其他开发人员也需要能够一目了然的知道这个名字的意思。不仅外键定义是如此,我们上面所说的主键的定义,及后面将要讲到的CHECK约束,都是类似的道理。

  二是参照完整性约束中,一般把两张表叫做主表与从表。主表就是被参考的表,就是上面例子中所讲的“部门信息表”,而从表就是“员工信息表”。在设计参照完整性功能的时候,我们要注意的的是,主表中被参考的字段与从表中被定义为外键的字段,无论是数据类型还是数据的长度都必须一致。否则的话,容易产生错误。这也是一种数据库开发的良好习惯。

  三是一单主表中的某个字段被其他表作为外键的话,则这个表的修改与删除就会收到限制。一般情况下,这个被其他表引用了的字段将不能被删除或者修改。用户强行删除的话,系统会提示该表已经有子记录。当然,也可以通过“级联修改”或者“级联删除”实现这个功能。级联修改是指主表中字段内容修改了,则从表中对应的内容也发生改变,如当采购部门名称改为物流部门的话,则在员工信息表中的采购部门也会自动改为物流部门;级联删除也是类似的道理,到主表中的记录被删除的话,从表中的记录也将被删除,当我把部门信息表中的采购部门这条记录删除之后,员工信息表中的所有采购部门的员工记录也将被删除。但是,正规的体育投注站很明显,这么操作的话,比较危险。所以,笔者一般都不建议如此操作。关于这个级联修改及级联删除功能或后续还会详细介绍。

  在Oracle10g中,Oracle推荐使用rsh命令而不是以前推荐的su命令了,在Oracle10gR2中,dbstart命令可以自动启动,因此在这两个版本之间有些不同之处,下面的说明更适合Oracle10g。

  一旦实例创建完毕,编辑/etc/oratab文件设置每个实例的重启标志为“Y”:

  接下来,作为root用户创建一个叫做/etc/init.d/dbora的文件,包括下面的内容:

  在FC5和FC6下尝试这个方法时有问题,rsh是不被支持的,结果,我宁愿使用su命令。

  在Oracle10gR2中使用时,调用dbstart可能会产生下面的错误消息:

相关标签:数据库完整性(11)
相关文章:
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:

Baidu