数据库系统原理:外键约束

yumo6663个月前 (04-05)技术文章24

关系数据库中最重要的约束是实体完整性和参照完整性。在SQL中,参照完整性称为外键约束。

学习SQL中参照完整性的实现方法。

一、参照完整性定义

外键约束指参照完整性检查。

根据参照完整性规则,依赖关系中外键或者为空值,或者是基本关系(参照关系)中的该键的某个值。

例如在SC中:

FOREIGN KEY (sno) REFERENCES S(sno)

FOREIGN KEY (cno) REFERENCES C(cno)

在表SC中,有两个外键,第一个外键是学号,使用“FOREIGN KEY”来表示学号是外键,它参考的是S表中学号的取值;同样,课程号也是一个外键,它参考的是课程表C中的课程号的取值。

上述内容是外键的定义的方法。其中,S和C称为基本关系或参照关系,SC称为依赖关系。

在SQL中,允许定义的参照完整性一般要求被参照的属性是主键或唯一性约束的属性。

二、参照完整性检查和违约处理

可能破坏参照完整性的情况及违约处理:

如上图所示,当在参照表中插入元组或修改外码值的时候,可能破坏S表中的参照完整性。在表SC中插入一个学生的选课记录,那么需要做的检查是看看在S表中是否有该生,如果S表中没有这个学生,那么默认违约处理,是拒绝SC表的插入的;还有一种处理的方法是递归插入,如果在SC表中插入的学生的信息递归插入到S表中。

同样,在SC表中,修改外键值的时候有可能破坏S表中的参照完整性,那么违约处理规则也是拒绝或递归插入。比如说修改SC表中的每一行信息的学号的取值,那么它级联去修改S表中的该学生的学号的取值或者拒绝去修改SC表中的某一个学号的值。

还有可能破坏参照完整性的情况是在被参照表S中删除元组或者是修改主码值的时候。在S表中删除某一个学生的记录,那么如果该生在SC表中有相应的选课记录,系统会做以下违约处理:拒绝(拒绝在S表中的删除)、级联删除(意味着删除掉某一个学生也要将他的选课的信息一起删除)、设置为空值、默认(如果该外键值允许为空的话,可以将外键值置为空值或者置为某一个默认值)。

同样,修改主码值的时候也有可能破坏参照表SC中的参照完整性。那么,同样的违约处理方法就是拒绝(拒绝S表中的主码值的修改)、级联删除(级联修改SC表中的主码值)、设置为空值、默认(如果该外键值允许为空的话,可以将外键值置为空值或者置为某一个默认值)。

参照完整性违约处理:

1)拒绝(NO ACTION)执行;(默认的违约处理策略)

2)级联(CASCADE)操作;

3)设置为空值(SET-NULL)或默认值(SET-DEFAULT)。

对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值,因为只有在允许为空的情况下才能置为空值。

可以在模式定义的时候显示、说明违约处理策略。

显式说明参照完整性的违约处理示例:

CREATE TABLE SC

(sno CHAR (4),

cno CHAR (4),

grade SMALLINT,

PRIMARY KEY ( sno ,cno ),

FOREIGN KEY (sno) REFERENCES S (sno)

ON DELETE CASCADE //级联删除SC表中相应的元组

ON UPDATE CASCADE //级联更新SC表中相应的元组

FOREIGN KEY (cno) REFERENCES C(cno)

ON DELETE NO ACTION) //当删除中C的元组造成了与SC表不一致时拒绝删除)

当建立SC表的时候,给出SC表中的三个属性列-学号、课程号、成绩的数据类型,指明主键是“学号和课程号”;接着要定义外键,学号是一个外键,它参考的是S表中的学号的取值,默认的违约处理是拒绝的,在其后可以修改违约处理的规则,表示可以级联删除、更新SC表中相应的元组;课程号也是一个外键,它参考的是C表的课程号,其后的语句即为显示定义它的违约处理规则-删除的时候是拒绝的,当删除中C的元组造成了与SC表不一致时拒绝去删除C表中的某一个元组。

例1:

已知:学生关系(学号,姓名,性别,专业号)、

专业关系(专业号,专业名,最高分),

试述在专业关系中删除某一专业时,DBMS可能的处理策略。

以上图为例,左边是专业关系,有三个专业,分别是m1、m2、m3;右边是学生关系,有四名学生-s1、s2、s3、s4,以及他们分别所在的专业m1、m2、m2、m3。

当在专业关系中删除某一专业,比如说删除m1计算机专业,DBMS可以采取以下几个措施:

①由于m1在学生关系中有引用,就拒绝在专业关系中m1专业的这行记录的删除;

②在专业关系中删除m1这一行的时候,级联将学生关系中所有专业号为m1的元组一并删除;

③允许删除“m1计算机”这一行在专业关系中的记录,由于在学生关系中专业号虽然是外键但是允许为空,因此在删除m1的时候在学生关系中的所有m1用空值来表示,意味着对于s1这个学生,不知道他的专业是什么;

④也可以置为一个默认值,比如说“只要不知道专业的都置为m2或m3”。

在这个示例中,DBMS可以采用以上四种处理策略。

三、总结

外键约束指参照完整性检查。根据参照完整性规则,依赖关系中外键或者为空值,或者是基本关系(参照关系)中的该键的某个值。

破坏参照完整性的情况及违约处理。在SQL中,可以在模式定义的时候显示、说明违约处理策略。

相关文章

一文搞懂数据库索引原理

前言写数据库,我第一时间就想到了MySQL、Oracle、索引、存储过程、查询优化等等。不知道大家是不是跟我想得一样,我最想写的是索引,为啥呢?以下这个面试场景,不知道大家熟悉不熟悉:面试官:数据库有...

DeepSeek本地RAG知识库(17):向量数据库原理讲解(小白也能懂)

大家好!我是程序员寒山。近日很多小伙伴问,为什么要用向量数据库?它到底是怎么存储数据的?今天就给大家揭秘一下向量数据库,看看它有什么神奇的地方?一、什么是向量数据?——菜谱变"坐标"说向量数据库前,首...

数据库系统原理:数据删除

SQL命令包括数据定义、查询、操纵和控制四大类。其中,数据操纵即数据更新包括数据插入、数据删除和数据修改三类。首先学习数据删除命令的用法。一、数据删除命令的基本用法语法:Delete From 基本表...

详解MySQL事务原理

今天给大家分享的是大数据开发基础部分MySQL的事务,事务在MySQL知识点中非常重要的部分,很多伙伴只是知道MySQL的四大特性,但不知道其中的原理,老刘这次给大家详细的描述MySQL四大特性的原理...

数据库系统原理:模式的定义与删除

SQL命令包括数据定义、查询、操纵和控制四大类,其中SQL的数据定义用于创建数据库中的各种数据对象。SQL的数据定义包括对SQL数据库、模式、基本表、视图和索引的创建和撤销操作。学习用SOL语言定义数...