开篇:润墨网以专业的文秘视角,为您筛选了一篇外键杂议一二范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要:外键是关系数据库的重要概念。本文谋求对外键比较直观、比较通俗的理解,同时就一些教科书中几个关于外键的叙述提出粗浅的看法。
关键词:关系数据库;外键
中图分类号:TP311.132.3 文献标识码:A
在关系数据库里,外键是个重要概念。
外键的定义,教科书给出的往往综合性强,涩于理解。例如:在关系模式R(U)中,若属性或属性组X不是关系R的关键字,但X是其它关系模式的关键字,则称X为关系R(U)的外关键字(外关键字即外键,关键字即主键)。
对于定义的诠释,外键应用的实例,往往分散在各个章节。这使得相互比照着理解外键变得不容易。
本文谋求对外键比较直观、比较通俗的理解。同时就一些教科书中几个关于外键的叙述提出粗浅的看法。
1 外键的功能
数据库中的表必须符合规范,才能杜绝数据冗余、插入异常、删除异常等现象。
规范的过程是分解表的过程。经过分解,同一事物的代表属性出现在不同的表中。显然,它们应该保持一致。例如,某学生的代表数据是学号012,在学生表里是012,在成绩表里也应该是012。
这种一致性由外键实现。外键的功能是:它的值一定是另一个表的主键值。学号在学生表里是主键,在成绩表里是外键。成绩表里的学号一定要是学生表里的学号。于是,学生表里的学号和成绩表里的学号就一致了。
可以直观地理解,外键的功能是实现同一事物在不同表中的标志一致性。
2 功能的实现
由外键联系的两个表,在单独操作时,外键功能由两种方法实现:
2.1 阻止执行
(1)从表插入新行,其外键值不是主表的主键值便阻止插入;
(2)从表修改外键值,新值不是主表的主键值便阻止修改;
(3)主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
(4)主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
2.2 级联执行
(1)主表删除行,连带从表的相关行一起删除;
(2)主表修改主键值,连带从表相关行的外键值一起修改。
两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。
从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
两种实现方法,通过下面方式选择:
(1)界面:设级联更新、级联删除两个选择方框,选取则级联执行、不选取则阻止执行;
(2)命令:设CASCADE、RESTRICT两个可选项,CASCADE为级联执行、RESTRICT为阻止执行。
3 在两个实体关系表中各自增加一个外来键的方法不能实现一对一联系
实现两个表的一对一联系,多本教科书提出一种方法,实录一处如下:
1:1联系到关系模式的转化
这种联系在两个实体关系表中各自增加一个外来键即可。例如:
经理(姓名,民族,住址,年龄,电话,名称)
公司(名称,注册地,类型,电话,姓名)
名称和姓名分别是公司和经理的码(关键字),在经理和公司两个关系表中,为了表明两者间的关系,各自增加了对方的码作为外来码,当两个表中出现这样的元组时:
(张小辉,汉,北京前门大街156号,48,68705633,京广实业公司)
(京广实业公司,北京复兴门外大街278号,有限责任,65783265,张小辉)
表明了张小辉是京广实业公司的经理。
这里没举例子,只做了一个人为的结论性的臆断:当两个表中出现……表明了……
这个结论性的臆断,无异于一个设问:除了理解为张小辉是京广实业公司的经理之外,还能做别的理解吗?
计算机的判断与人为的臆断不同。
按照两个表主键、外键的设置,试作如下输入:
经理(姓名,民族, 住址, 年龄,电话,
名称)
张小辉 汉
北京
48 68705633 木材公司
李四
回
天津
31 56784534 京广实业公司
王五
汉
山东
37 1357
机电公司
公司(名称,
注册地,类型,
电话,
姓名)
京广实业公司 北京
有限责任 65783265 张小辉
木材公司
天津
有限责任 65768667 李四
机电公司
山东
有限责任 65656768 王五
这完全是合理的:经理表里的名称是公司表里的名称,公司表里的姓名是经理表里的姓名。
但是,张小辉是哪个公司的经理、木材公司的经理是谁,看得出来吗?更不要说经理与公司的一对一联系了。
实际上,两个表――
经理(姓名,民族,住址,年龄,电话)
公司(名称,注册地,类型,电话)
用下面两种方法可以实现一对一联系:
(1)在经理表里加上公司表的主键作外键并设置unique not null约束,公司表不动
经理(姓名,民族,住址,年龄,电话,名称)
公司(名称,注册地,类型,电话)
这样,经理的姓名不重复(主键约束),后面公司的名称是公司表里的公司名称(外键约束),并且不重复(unique not null约束),经理与公司的一对一的联系便建立起来了。
需要注意的是:unique not null约束不能少,不然后面公司的名称可以重复,建立起来的联系便是一对多。
作为例子,下面两张表实现了经理与公司的一对一联系:
经理(姓名, 民族,住址, 年龄,电话,
名称)
张小辉 汉
北京
48
68705633 京广实业公司
李四
回
天津
31
56784534 木材公司
王五
汉
山东
37
1357
机电公司
公司(名称,
注册地,类型,
电话)
京广实业公司 北京
有限责任 65783265
木材公司
天津
有限责任 65768667
机电公司
山东
有限责任 65656768
(2)在公司表里加上经理表的主键作外键并设置unique not null约束,经理表不动
经理(姓名,民族,住址,年龄,电话)
公司(名称,注册地,类型,电话,姓名)
分析类似,unique not null约束同样不能少。
4 联系表的主键不一定是两个相连实体主键的组合
联系表的主键怎么确定?多本教科书认为:与该联系相连的各实体的主键以及联系本身的属性均转换为关系的属性,而关系的主键为两个相连实体主键的组合。例如:
学生(学号,姓名,年龄,性别)
课程(课程号,课程名,学时数)
这两个关系的联系是一个m:n联系:
选修(学号,课程号,成绩)
其中学号与课程号为组合主键。
例子中联系关系(选修)的主键是正确的。但是,所叙述的方法没有普遍性。
例如两个关系――
教师(教师编号,姓名,职称)
课程(课程号,课程名,学时数)
按照上述方法,这两个关系的联系是一个m:n联系,教师编号与课程号为关系的组合主键――
授课(教师编号,课程号,时间,教室)
这样一来,一个教师授一门课只能一时一地(主键〈教师编号,课程号〉的值不能重复),而不能多上几次,这不符合实际要求;同时,一个教师同一时间却可以授多门课(教师编号与时间的组合可以重复),这更有悖常理。
授课关系的主键只能是(教师编号,时间),它就不是两个相连实体主键的组合。
联系表需要与该联系相连的各实体的主键作为属性、作为外键。但是,联系表的主键不能统一为“两个相连实体主键的组合”,而是需要具体确定――尽管很多情况之下确实为“两个相连实体主键的组合”。
5 外键能不能同时作为表的主键?
一般都说,外键不是本关系的主键,却是它关系的主键。
模式分解并不是绝对的。完全依赖于主键的非主属性,有时候出于数据管理效率的考虑,也另存为关系。例如学生家长的信息,作为学生的属性,完全依赖于学号,放在学生表里理所当然。然而,家长信息使用率不高,放在学生表里会降低数据管理效率,另存为家长表更为合适。
这时候,家长表应包含学生的学号,并作为外键,每一行的学号必须在学生表里存在。
那么,家长表的主键是什么?当然可以另外编号,但用学号作主键未尝不可。这样一来,学号作外键,同时作主键。
用下面命令可以建立起这个家长关系:
Create table 家长
(学号 char(5) primary key foreign key references 学生,
姓名 char(8),
年龄 tinyint,
工作单位 char(20),
地址 char(20),
电话 char(11))
由此看来,外键既是该关系本身的主键,又是另一关系的主键,有什么不妥吗?
6 结语
本文意在将外键的概念对应到客观事物之间的真实联系上,或者是将客观事物之间的真实联系落实到外键的概念中,可以说是在寻求对外键的比较直观、比较通俗、比较容易接受的理解。想法可能粗糙、不当或有误,提出来供切磋。
参考文献
[1]陈洛资.数据库系统及应用基础[M].北京:北京交通大学出版社,2002.
[2]孔璐,吴志坚,顾洪.数据库原理与开发应用技术[M].北京:国防工业出版社,2004.
[3]关敬敏,沈立强,李莉.SQL Server数据库应用教程[M].北京:清华大学出版社,2005.
[4]苗雪兰,刘瑞新,宋歌.数据库系统原理及应用教程[M].北京:机械工业出版社,2007.
[5][美]Alex Kriegel,Boris M.Trukhnov著.陈冰等译.SQL宝典[M].北京:电子工业出版社,2003.
[6][美]JAMES R.GROFF,PAUL N. WEINBERG.章小莉,宁欣,汪永好,等译.SQL完全手册(第二版)[M]. 北京:电子工业出版社,2006.
[7][美]Paul Nielsen著.刘瑞,陈微,闫继忠,刘文,等译.SQL Server 2000宝典[M].北京:中国铁道出版社,2004.
[8][美]Robert Sheldon著.黄开枝,冉晓译.SQL 实用教程[M].北京:清华大学出版社,2004.