当前课程知识点:数据库概论 > 第四章 数据库完整性、视图与安全性 > 4.3 外键约束 > 外键约束
同学们好
我是来自云南大学软件学院的包崇明
下面为大家介绍外键约束
前面我们学习了部分列级约束和表级约束
现在来看一下外键约束
相对于其他约束
外键约束定义更加复杂
更具灵活性
外键约束
保证了参照完整性
参照完整性维护表与表之间的相关性
一般涉及到两张表
我们命名为T1表和T2表
T1表和T2表的相关性是指
T2表中某些字段的组合值
只能取T1表中主键或者候选键的组合值
或者T2表中这些字段至少一个取空值
这类约束称为参照完整性
一般用外键约束来保证参照完整性
实现上
我们需要在T2表上
定义这些字段的外键约束
让其参照T1中主键或者候选键
实现参照完整性可有多种选择
所以外键约束提供多种选项
定义外键约束后
T1表和T2表上的更新操作
都会受到影响
下面我们通过两张相关的表
来进一步理解参照完整性及外键约束
一张表为雇员表
包括eid
ename
address和dno四个字段
其中eid为雇员标识
定义为主键
dno字段表示雇员所在部门
另外一张表为部门表
包括dno和dname两个字段
其中dno表示部门编号
为部门标识
定义为主键
dname为部门名称
我们的设计意图要求雇员表中
dno字段的取值要么为空
表示这个雇员的部门尚未确定
要么必须取部门表中已经存在的一个部门
就这是参照完整性
我们通过在雇员表中
设置一个外键约束来实现参照完整性
我们在创建雇员表时
在字段dno上面定义了一个列级约束
关键字REFERENCES
将字段dno定义为外键
后面需要给出所参照的表和参照的字段
本例中我们给出所参照的表是部门表
但没有指定参照的字段
这种情形表示
外键dno参照的是部门表的主键
通过上述外键定义
数据库管理系统
能够保证将雇员表中
dno字段的取值限定为取空值
或者取部门表中已存在的一个部门的标识
保证了我们的设计意图
外键约束涉及到两张表
如果对部门表进行增删改操作
会不会影响到雇员表的参照完整性呢
我们通过一个表来看一下
对部门表和雇员表进行
插入删除和更新操作时
为了保证参照完整性
数据库管理系统需要做的一些测试
以及提供的可选操作
表中第一行是部门表
它的主键dno
被雇员表的外键dno参照
第二行是雇员表
定义了外键dno参照部门表的主键
对雇员表来说
对其进行增删改操作
参照完整性由外键约束dno保证
当插入一个新雇员时
雇员的部门值需要为空
或者在部门表中存在
当删除一个雇员时
不会影响到参照完整性
数据库管理系统不会进行检测
当更新雇员信息时
数据库管理系统需要测试
更新是否涉及到部门
如果更新后的部门不为空
并且没有在部门信息表中存在
则不允许更新操作
对部门表来说
当插入一个新部门时
由于不会影响已有雇员的部门信息
所以不需要进行检测
当删除一个部门时
由于这个被删除的部门可能
被雇员表中某些雇员参照
也就是说
雇员表中某些行上面字段dno的值
是即将被删除的部门
如果直接删除部门
将导致这些雇员的dno字段的值
在部门表中不存在
从而违反了参照完整性
为了保证参照完整性
在删除部门时
数据库管理系统需要进行检测
并提供数据库管理员
根据情况设定相应的操作
数据库管理系统一般提供三种常见操作
第一种选择
如果删除的部门被某些雇员参照
也就是这个部门中还有雇员
那么这个部门行不允许被删除
这是默认的操作
我们前面定义的外键dno就是这类操作
第二种选择是
如果删除的部门被某些雇员参照
那么将这些雇员的dno字段设置为空值
实现这种操作需要在外键定义后面加上
加上子句
ON DELETE SET NULL
第三种选择是
如果删除的部门被某些雇员参照
那么在部门表中删除该部门后
将从雇员表中删除该部门的所有员工
这种选择我们称为级联删除
实现这种操作需要在外键定义后面
加上子句
ON DELETE CASCADE
当对部门表进行更新时
也可能破坏参照完整性
因为可能更新一个部门的标识
而这部门标识正被一些雇员参照
所以也要做检测
数据库管理系统也提供了一些操作
以供选择
这些操作和前面讲述的删除一个部门时的
可选操作类似
默认是不允许进行更新操作
在这就不详细讲述
请同学们参看课本
通过Create table语句
创建约束后
可通过Alter Table语句
进行修改或者删除命名的约束
也可以在表上增加新的约束
我们用一个例子来说明
在这个例子中
我们用Alter Table语句
给表sale新增两个约束
一个是命名的主键约束
将字段sid设置为主键
另外一个是命名的check约束
限制字段dollars的取值
只能小于1000
好了
同学们
我们下节课见
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video