徐爱芸
摘要:关系数据库外键是用于与另一张表的关联,保证了数据的完整性和一致性。设置不同的选项灵活运用,可以减少冗余,提高系统的性能。
关键词:外部关键字;表关联;数据完整性;数据一致性
1 前言
在关系数据库中,維护数据的一致性和完整性可以通过手工方式更新使得多个表之间的数据保持一致;设计更复杂的程序设计逻辑并编写应用程序可以维护数据库的完整性和一致性;在服务器端通过设置表的触发器,一旦执行更新和删除表中的某些数据行,事件自动触发以维护预定义的某些动作,维护数据库的一致性;利用数据库级别的外键处理方式来帮助维护数据库完整性,是最简单的方式。通过外键(FK)建立和加强两个表数据之间的连接,在更新或者删除数据行时可以保持数据库的完整性,更加可靠。
2 外键存在的意义
如果有学生的信息(学号s#,姓名sname,系号d#、系名dname)需要存储,可以有一下几种方式:
2.1信息都存入到一个表中
如果所有信息都放在同一个表中,即S(s#,sname,d#、dname),同一个系部的信息存储次数与该系学生人数相同。这种表结构存在严重的信息冗余(d#、dname列),如果学生人数比较多,这一问题表现的越严重,且还会带来修改复杂,插入异常,删除异常等,导致数据库使用异常。
2.2建立两个表的逻辑连接
把学生信息与系部信息分开存储,即S(s#,sname,d#)和D(d#、dname),解决了数据冗余的问题,但两张表并没有建立关联,在内容和逻辑关系上不能保持同步和一致,且存在插入异常和删除异常问题,依然无法保证数据完整性。
2.3 建立两个表逻辑上的物理连接
这种方案为S表添加了外键d#,指向D表的主键d#,该约束起到了保护数据完整性的作用:如果删除D的系部信息d#已经在S表中使用,则该条数据无法删除;无法向S表中添加系部d#不存在的系部信息。这样就消除了数据冗余、插入异常、删除异常等。
外键用于与另一张表的关联,使两张表形成了物理关联,外键只能引用主表中主码的值,控制存储在外键表中的数据能保持与主表中的数据一致性,从而保证了数据的完整性。
3 外键选项设置
为了灵活有效的保证数据的一致性和完整性,在定义数据库外键时有一个可选项,用来设置当主键表中的被参照属性的数据发生变化时,外键表中相应属性的事件触发限制。
(1)cascade级联更新或级联删除:当主键表被参照属性的值执行更新或删除操作时,外键表参照属性的值相应会同步更新或删除,该条数据在父表和子表中的记录都被成功更新或者删除。
(2)restrict受限更新或受限删除:如果想要更新或删除主键表中的记录,而在外键表中有关联该主键表的记录,则不允许更新或删除主键表中的记录。即数据没有被更新或删除,父表和子表都没有变动。
(3)set null置空:当主键表被参照属性的值执行更新或删除时,外键表中相应的参照属性的值置为null,前提条件是在设计外键表的时候该属性要允许为null,否则会出错。即该条记录在父表中被删除,在子表中对应记录的外键值被置为null。
(4)set defaule置为默认值:当主键表被参照属性的值执行更新或删除时,外键表中相应记录的参照属性的值置为默认值。
4 外键选项功能的实现
(1)CASCADE级联规则实现
在S(s#,sname,d#)中对外键设置了on update on delete规则:
foreign key(d#) references D(d#) on update cascade on delete cascade
假如院系表D中的某个系修改了信息,那么在S表中属于该系学生的信息一并被修改;假如删除了D表中的某个系,则在S表中该系的学生信息一并被删除了,自动修改或删除子表数据。这样的联动效应使得系统的性能更好,这就是外键的作用,保持数据的一致性、完整性。
(2)NO ACTION或RESTRICT规则实现
在S(s#,sname,d#)中对外键设置了no action规则:
foreign key(d#) references D(d#) on update no action on delete no action
当在S表中设置外键取值为No Action或者Restrict时,则当在主键表D中修改或删除一条系的记录时,系统首先检查该记录在外键表S中是否有对应记录,如果有学生在该系,则不允许修改或删除(即外键表约束主键表)。
(3)SET NULL规则实现
在S(s#,sname,d#)中对外键设置了set null规则:
foreign key(d#) references D(d#) on update set null on delete set null
当取值为Set Null时,则当在主键表D中修改或删除一条系的记录时,首先检查该记录在S表中是否有对应外键,如果有则将S表中对应的记录的系的值(外键值)设置为null。这里也是外键表约束主键表,不过这就要求该外键允许取null。
(4)SET DEFAULT规则实现
在S(s#,sname,d#)中对外键设置了set default
foreign key(d#) references D(d#) on update set default on delete set default
当取值为Set Default时,则当在主键表D中修改或删除一条系的记录时,首先检查该记录在S表中是否有对应外键,如果有则将S表中对应的记录的系的值(外键值)设置为默认值。
结束语
外键是用来控制数据库中数据的数据完整性的,阻止非法数据的存入,减少数据库冗余性,避免了脏数据的产生,保证数据一致性有很大作用。外键是数据库一级的一个完整性约束,是参照完整性的数据库实现方式.
参考文献
[1]刘亚军,数据库原理与应用[M]清华大学出版社:北京 2020.7
[1]万常选,数据库系统原理与设计(第3版)[M]清华大学出版社:2018.1