admin 管理员组文章数量: 1086019
2024年3月19日发(作者:aspu)
基于SQL Server 2005外键技术的教学实践
摘 要: 外键(foreign key,简称fk)可以建立表于表之间的
联系,方便程序的编写,同时外键也是实现数据库参照完整性的重
要保障,外键在sql server 2005表设计环节起着至关重要的作用。
关键词: 外键;参照完整性;约束
1 外键概述
外键是指一个表中的一列或列组合,它虽不是该表的主键,却是
另外一个表的主键。通过主键约束可以为相关联的两个表建立联
系,实现数据的参照完整性。外键约束方式将可以使两张表紧密的
结合起来,特别是修改或者删除的级联操作将使得日常的维护工作
更加轻松。例如,有“学生”表(学号,姓名,性别,出生日期,
入学时间,班级代码,系部代码,专业代码)和“班级”表(班级
代码,班级名称,专业代码,系部代码),如果要求“学生”表中
“班级代码”列的取值,必须是“班级”表的“班级代码”列的列
值之一,就应该在“学生”表的“班级代码”上创建外键约束,从
而使“学生”表和“班级”表中的“班级代码”具有一致性。
外键约束不仅可以与另一张表上的主键约束建立联系,也可以与
另一张表上的uniqu约束建立联系。外键约束上允许存在为null
的值,则针对该列的外键约束核查将被忽略。外键同时也限制了对
主键所在表的数据进行修改。当主键所在的表的数据被另一张表的
外键所引用时,用户将无法对主键里的数据进行修改或删除。除非
事先删除或修改引用的数据。当一个新的数据加入到表格中,或对
表格中已经存在的外键上的数据进行修改时,新的数据必须存在于
另一张表的主键上。
外键约束它还可以控制对主键表中数据的修改。外键约束并不仅
仅只可以与另一表的主键约束相链接,它还可以定义为引用另一表
的unique约束。外键约束不允许空值,但是,如果任何组合外键
约束的列包含空值,则将跳过外键约束的校验。外键约束可以引用
同一表中的其它列(自引用)。一个表最多可包含253个外键约束。
每个表在其外键约束中最多可以引253个不同的表。
2 外键的创建
1)使用ssms创建外键约束。右击“学生”表在弹出的快捷菜单
中选择“修改”命令,打开“表设计器”对话框。在“表设计器”
中,右键单击任意字段,在弹出的快捷菜单中单击“关系”命令,
打开“外键关系”对话框。单击“添加”命令按钮,系统给出默认
的外键约束名:“fk_学生_学生”,显示在“选定的关系”列表中。
单击“fk_学生_学生”外键约束名,在其右侧的“属性”窗口中单
击“表和列规范”属性,然后,再单击该属性右侧的“…”按钮,
打开“表和列”对话框。在“表和列”对话框中,修改外键的名称,
选择主键表及表中的主键,以及外键表中的外键。单击“确定”命
令按钮,回到“外键关系”对话框。
2)使用t-sql语句创建外键约束,在“student”数据库的“学
生”表上,为“班级代码”创建外键约束,从而保证在“学生”表
中输入有效的“班级代码”。代码如下:
use student
alter table 学生
add constraint fk_bjdm foreign key(班级代码)
references 班级(班级代码)
3 外键的意义
1)外建保证表与表之间的完整性和一致性,这是数据固有的,
由数据库进行自动管理。2)使用外建,简单直观,可以直接在数
据模型中体现,无论是设计、维护等回有很大的好处,特别是对于
分析现有的数据库的好处时非常明显的,用触发器也可以实现数据
的参照完整性,但是触发器则可能会有一些隐患,如设计上的缺陷、
批量数据的导入、删除等等都会影响系统性能。但是外键就非常明
显和直观,而且简单易学。3)存在就有道理,创建外键还要考虑
设计层面,不同的层面使用不同的业务逻辑。在数据层上规定一些
业务规范和约束,同时数据库设计师已经设计了一个很好的数据模
型,那么可以通过数据库管理系统带的主键、外键、缺省和约束等
条件来实现一些业务逻辑。当然现在流行3层或n层结构,业务逻
辑都搬到业务层,数据层只提供数据存储,那么这些约束和表之间
的关联,可以在业务层去处理,就不用创建外键。4)外键的存在
增加了er图的可读性,这也同样是在后台数据库表非常多的时候
能够体现出来的,外键能够明确的两个表之间的关系。例如一个单
据的主表和单据的商品的子表,如果两个表没有拉出外键表明关
系,且两个表的位置在er图中很远,对于一个对这个系统不是非
常了解的人来说,让他去理出两个表之间的关系是很麻烦的。如果
设置了外键,我们能通过他们之间的外键连接找出他们之间的关系
来,er图的可读性对于一个刚刚接触数据库的新手来说是极为重要
的。
4 外键的设计难点
1)由于一些数据库的特殊设计,在同一个数据库的不同表中,
存在存储内容一致,但是字段名称不一致的现象,例如:在“班级”
表中我们重命名“班级代码”字段为“班级编码”,这样在“班级”
表和“学生”表中,表面上看没有共有字段,但是“学生”表的“班
级代码”和“班级”表的“班级编码”数据类型一致,存储内容的
意义一致。在这种情况下还是可以在两个表之间创建外键约束。2)
外键的个数也不是没有个尺度,因为外键创建过多会导致er图极
为混乱(到处都是线)所以应该掌握合适的尺度才行,必要的外键
必须要创建,如果实在不想因为外键过多而造成er图的混乱,可
以对基础数据的删除用假删除的办法,以避免在没有外键约束和检
查的情况下造成数据的不一致性。3)级联更新相关的字段,无论
何时更新主键值,都指示dbms自动更新该关系的外键值。如果指
定cascade,则在父表中更新被引用行时,也将在引用表中更新引
用行;如果指定noaction,sql server将产生一个错误并回滚父
表中的行更新操作。4)级联删除相关的字段,无论何时删除主表
的被引用行,都指示dbms自动删除外键表的行。如果指定cascade,
则从父表中删除被引用行时,也将从引用表中删除引用行;如果指
定no action,sql server将产生一个错误并回滚父表中的行删除
操作。
5 总结
创建外键约束的目的是通过数据库去保证数据的完整性,提高关
联查询的效率,这样做也有一定的缺点就是:插入或更新的效率下
降。所以在有些时候我们可以考虑不创建外键约束:一种是可以忍
受数据不完整性,或认为程序已经可以控制数据的完整性。另一种
是当两个表关联查询很多的时候,但两个表的数据量不大或两个表
关联查询很多,对查询效率不高,对插入或更新的效率要求高。还
有一种是两个表没有任何逻辑联系是就不需要创建外键约束了。
参考文献:
[1]杨雪全,《sql server 2005实例教程》,电子工业出版社,
2009.4.
[2]章立民,《sql server 2005数据库开发实战》,机械工业出版
社,2007.1.
版权声明:本文标题:基于SQLServer2005外键技术的教学实践 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1710797064a573601.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论