数据库原理与应用 第 2 章 · 第五节
课程第 2 章第五节 三类完整性实体完整性参照完整性三种处理用户自定义
第 2 章 关系数据库 · 第五节

关系的完整性

主码不能空,外码要有来源,业务规则写进数据库
本 节 知 识 点
  1. 35关系的完整性
  2. 36实体完整性
  3. 37参照完整性
  4. 38删除被参照的行:三种处理方式
  5. 39用户自定义完整性
35
第 2 章 · 第五节

关系的完整性

完整性约束分三类:实体完整性和参照完整性是关系模型必须满足的,用户自定义完整性体现具体应用的语义。

第 35 页课件

关键术语

完整性约束Integrity Constraint
数据必须满足的规则,用来保证数据正确、有效、彼此相容。

重 点三类各盯一样东西

实体完整性盯主码,参照完整性盯外码,用户自定义完整性盯具体属性的取值。前两类是关系模型自带的规矩,任何 DBMS 都自动检查。第三类由设计者按业务定义,第 5 章建表时会用 CHECK 一类的语句写出来。

练一练

“成绩必须在 0 到 100 之间”属于哪一类完整性?
  1. A实体完整性
  2. B参照完整性
  3. C用户自定义完整性
  4. D不属于完整性约束
答案 C

成绩的取值范围是这个应用自己的业务规则,与主码、外码都无关,属于用户自定义完整性。

想一想

“学号不能为空”属于哪一类?

36
第 2 章 · 第五节

实体完整性

实体完整性规定主码的值不能为空,也不能部分为空,组合主码的每一列都要有值。

第 36 页课件

重 点两个例子和几个比方

课程关系的主码课程号不能空,授课关系的主码教师号加课程号两列都不能空,只填一列也不行。课件下半页的比方:每个人一本护照,每件行李一个条形码,没有准考证号就进不了考场,图书馆同一本书的多册用 ISBN 加副本号才分得开。“幽灵同学”说的是没有学号的学生记录,数据库会当场拦下。

试一试试着插三条记录

课程表 c,主码是课程号
课程号课程名课时
c1数据库原理48
c2高等数学60
试着往表里插三条记录,看哪条能进去。

想一想

为什么主码不能为空,姓名却可以为空?

37
第 2 章 · 第五节

参照完整性

参照完整性规定外码的值要么为空,要么必须在被参照关系的主码里存在,订单里的商家 ID 必须是商家表里真有的。

第 37 页课件

关键术语

参照完整性Referential Integrity
外码的取值只能是被参照关系中已有的主码值,或者为空。

重 点读图

商家表的商家 ID 是主码,订单表的商家 ID 是外码,指向商家表。订单 O004 的 R99 在商家表里不存在,所以这一行不允许出现。“或者为空”这半句课件没有写,教材的定义里有,外码取空值表示暂时没有对应的那一方。

打个比方

点外卖只能从平台上有的店里选,不能给一家不存在的店下单。平台的商家列表就是被参照关系。

想一想

订单表的商家 ID 允许暂时为空吗?

38
第 2 章 · 第五节

删除被参照的行:三种处理方式

删除被参照的行时有三种处理:禁止删除、级联删除、把外码置空,SQL 里分别叫 RESTRICT、CASCADE、SET NULL。

第 38 页课件

重 点三种方式各一句后果

RESTRICT 最安全,要先删掉 O002 才能删 R03。CASCADE 最省事也最危险,删一个商家,它的订单一起没了。SET NULL 保住了订单,但这笔订单从此不知道来自哪家店。第 5 章写 FOREIGN KEY 时可以指定用哪一种,不写的话 MySQL 默认按 RESTRICT 处理。

试一试删掉还有订单的商家,看三种处理

商家表 Restaurant,商家 ID 是主码
商家 ID商家名
R01兰州拉面
R02重庆小面
R03沙县小吃
订单表 Order,商家 ID 是外码
订单号用户商家 ID
O001张三R01
O002李四R03
O003王五R02
订单表的商家 ID 指向商家表。试试插一条指向不存在商家的订单,或者删掉还有订单的商家。

想一想

银行删除一个客户,他的转账记录该用哪一种处理?

39
第 2 章 · 第五节

用户自定义完整性

用户自定义完整性是某个具体应用自己的规矩,由 DBMS 统一定义和检验,不交给应用程序。

第 39 页课件

重 点最后一句最要紧

规则写进数据库,而不是写进程序。程序有很多个,每个都自己检查,总会有一个漏掉,数据库只有一个,在这里检查一次就够。课件下半页的四个例子:成绩 0 到 100,年龄满 16 才能选酒类品鉴,一个班最多一个男班长一个女班长,每门课容量上限。在 SQL 里,简单的靠 CHECK 和 NOT NULL,复杂的靠触发器。

打个比方

学校规定只能从校门进,保安在校门查一次,比每栋楼各自安排人查可靠得多,数据库就是那个校门。

想一想

“每门课最多 100 人”这条规则,靠一条 CHECK 能写出来吗?

保山学院·人工智能教研室·曹鼎鼎