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.


本文标签: 外键 约束 数据