数据库原理与应用 第 5 章 · 第三节
课程第 5 章第三节 唯一约束唯一例子主键约束主键例子主键与唯一外键约束四种策略外键例子检查约束检查例子 版式
第 5 章 数据表的管理和表中数据操纵 · 第三节

表的五种约束

不能空、不能重、身份证、连两张表、划范围
本 节 知 识 点
  1. 14UNIQUE 约束
  2. 15UNIQUE 的两种写法
  3. 16PRIMARY KEY 约束
  4. 17单字段主键与联合主键
  5. 18PRIMARY KEY 与 UNIQUE 的区别
  6. 19FOREIGN KEY 约束
  7. 20外键的语法与四种策略
  8. 21建带两个外键的选课表
  9. 22CHECK 约束
  10. 23给成绩加一句 CHECK
14
第 5 章 · 第三节

UNIQUE 约束

UNIQUE 保证这一列(或几列合起来)不出现重复值。

第 14 页课件

分清楚

两种写法写在哪
列约束跟在字段后面
表约束写在所有字段之后

记牢它三条

  1. 一张表可以有多个
  2. 允许留空
  3. 空值不算重复

重 点

表约束能把几列绑在一起,比如姓名加性别合起来不重复。

15
第 5 章 · 第三节

UNIQUE 的两种写法

同一件事,列约束和表约束两种写法都能办到。

第 15 页课件

练一练

一个 UNIQUE 列里能不能有两个空值?
  1. A不能,会报重复
  2. B能,空值不算重复
  3. C只能有一个空值
  4. D要看用什么引擎
答案 B

MySQL 认为空值不等于空值,所以两个空值不算重复。

上机做

上机第 4 题 亲手撞一次重复

想一想

把姓名设成唯一,以后会碰上什么麻烦?

16
第 5 章 · 第三节

PRIMARY KEY 约束

主键是每一行的身份证,不能空也不能重。

第 16 页课件

关键术语

主键PRIMARY KEY
唯一标识一行的那一列或几列。

分清楚

两种写法用在哪
列约束单个字段当主键
表约束几个字段合成主键

重 点

一张表只能有一个主键,但主键可以由好几个字段合起来当。

17
第 5 章 · 第三节

单字段主键与联合主键

学生表拿学号当主键,选课表拿学号加课程号。

第 17 页课件

打个比方

一个学生选一门课才算一条记录,两个号合起来才认得出是哪一条。

上机做

上机第 5 题 建带联合主键的表

想一想

选课表为什么不能只拿学号当主键?

18
第 5 章 · 第三节

PRIMARY KEY 与 UNIQUE 的区别

两个都保证不重复,差别在三处。

第 18 页课件

试一试试三件事,看差在哪

试一下
主键
唯一
两个都保证不重复,差别就在这三件事上。

分清楚

比什么主键唯一
有几个只能一个可以多个
能不能空一定不空可以为空

重 点

同一列不要既设主键又设唯一,主键本身已经包含了这两条。

19
第 5 章 · 第三节

FOREIGN KEY 约束

外键把两张表连起来,管住引用的正确性。

第 19 页课件

关键术语

主表
提供主键给别人引用的那一张。
从表
它的外码必须能在主表里找到。

打个比方

选课表里的学号,必须是学生表里真有的学号,不能凭空编一个。

上机做

上机第 6 题 插一个不存在的学号

20
第 5 章 · 第三节

外键的语法与四种策略

主表那一行被删或被改,从表有四种反应。

第 20 页课件

试一试删掉学生 s1 会怎样

删掉学生 s1
主表 学生表 s
snosn
s1张三
s2李四
从表 选课表 sc
snocno
s1c1
s1c2
s2c1
选课表里还挂着 s1 的两条记录,这时候删学生会怎样。

分清楚

策略主表删了怎么办
RESTRICT有人引用就不让删
CASCADE从表跟着一起删
SET NULL从表外码改成空
NO ACTION和 RESTRICT 一样

重 点

不写就是 RESTRICT,先删从表再删主表最稳妥。

21
第 5 章 · 第三节

建带两个外键的选课表

选课表两个外键,一个指学生表,一个指课程表。

第 21 页课件

记牢它三个前提

  1. 主表要先存在
  2. 引用的那列是主键
  3. 两边类型必须一样

重 点

外码可以为空(表示还没选课),主键绝对不能为空。

上机做

上机第 6 题 照着建一次

22
第 5 章 · 第三节

CHECK 约束

CHECK 给字段划一个合理范围,超了就不让进。

第 22 页课件

关键术语

CHECK
写一个条件,值不满足就拒绝写入。

打个比方

成绩只能 0 到 100,有人填 200 分,数据库当场拒收。

上机做

上机第 7 题 填一个 180 分试试

23
第 5 章 · 第三节

给成绩加一句 CHECK

给 score 加一句 CHECK,成绩就再也超不了 100。

第 23 页课件

练一练

给 CHECK 约束起个名字,有什么用?
  1. A跑得更快
  2. B以后能按名字删掉它
  3. C可以写更复杂的条件
  4. D更省空间
答案 B

起了名字,以后 DROP CONSTRAINT 才找得到它。

重 点

写在所有字段后面的叫表约束,跟在字段后面的叫列约束。

想一想

成绩允许加分到 120,这句 CHECK 该改成什么?

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