数据库原理与应用 第 5 章 · 上机
课程第 5 章上机 准备建学生表必填与默认唯一约束建课程与选课外键拦路插入三姿势改数据改表结构删字段删约束删数据收工连续练习 版式
第 5 章 数据表的管理和表中数据操纵 · 上机

上机练习

十二道题按讲义顺序排。左边是真能跑的 MySQL,建的表真存住,约束真拦人,做完在右上角打个勾。
已完成 0 / 12
本 次 上 机 题 目
  1. 01准备环境:建库、进库、看看空不空
  2. 02建学生表 s
  3. 03NOT NULL 与 DEFAULT 的脾气
  4. 04给姓名加 UNIQUE,再撞一次车
  5. 05建课程表 c 和选课表 sc
  6. 06外键真的拦得住吗
  7. 07整行插、部分插、超范围插
  8. 08UPDATE 改一行与改全表
  9. 09ALTER TABLE 六连击
  10. 10DROP 字段与 DROP 约束
  11. 11DELETE 与外键的第二次拦截
  12. 12按正确顺序删表
  13. 连续练习版
01
第 5 章 · 上机

准备环境:建库、进库、看看空不空

先把 teaching 库准备好,确认里面还没有表。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

第一条会提示已经存在,这是 IF NOT EXISTS 在替你挡下报错。

知道更多

这台终端是真解释器,敲什么真算什么,建的表会一直留到你删掉为止。

想一想

SHOW TABLES 说是空的,你打算先建哪张表?

02
第 5 章 · 上机

建学生表 s

照教材的写法把学生表建出来,六个字段加一个主键。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点一句没写完就回车

提示符会变成箭头等着你补,真机也是这样,分号才算说完。

分清楚

想看什么敲哪一条
字段一览DESC s
完整建表语句SHOW CREATE TABLE s

想一想

回显里的 sex 那一行,Default 列写的是什么?

03
第 5 章 · 上机

NOT NULL 与 DEFAULT 的脾气

一条不给学号,一条不给性别,看哪条能进去。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点两条的差别

第一条没给 sno 报 1364,第二条没给 sex 却成了,因为 sex 有默认值。

练一练

同样是 NOT NULL,为什么 sex 不给值也能插进去?
  1. Asex 其实可以为空
  2. Bsex 写了 DEFAULT,有兜底的值
  3. CENUM 类型不受约束
  4. DMySQL 自动补第一个值
答案 B

NOT NULL 加 DEFAULT,不给值就用默认值,所以插得进去。

想一想

给 sno 也加一个默认值,是好主意吗?

04
第 5 章 · 上机

给姓名加 UNIQUE,再撞一次车

加上唯一约束,然后故意插一个重名的学生。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

第二条报 1062 Duplicate entry,姓名重了就是重了。

知道更多

最后一条能看到 UNIQUE KEY uq_sn 这一行,起了名字以后才好删。

想一想

现实里给姓名加唯一约束,会出什么问题?

05
第 5 章 · 上机

建课程表 c 和选课表 sc

一张带 CHECK,一张带联合主键和两个外键。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点顺序不能反

sc 引用了 s 和 c,所以这两张必须先建出来,否则报 1824。

记牢它三个约束

  1. 联合主键 sno 加 cno
  2. 两个外键各指一张表
  3. CHECK 管住成绩范围

想一想

选课表为什么要拿两个字段合起来当主键?

06
第 5 章 · 上机

外键真的拦得住吗

先插两门课,再故意插一个不存在的学号。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

第二条报 1452,学生表里根本没有 s99,外键当场拦下。

打个比方

就像报名表上写了一个查无此人的学号,登记员直接把表退回来。

想一想

如果没有外键约束,这条脏数据会怎么样?

07
第 5 章 · 上机

整行插、部分插、超范围插

一次插多行、只填两列、再试一个 180 分。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

第二条只填了两列,score 自动是空值。第三条报 3819,被 CHECK 挡回来。

记牢它三种写法

  1. 多行用逗号隔开
  2. 部分列自动补空值
  3. 超范围被 CHECK 拦

上机做

上机第 8 题 接着把成绩补上

08
第 5 章 · 上机

UPDATE 改一行与改全表

改一个人的专业,再给所有人的年龄加一岁。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点看回显那两行

Rows matched 是命中几行,Changed 是真改了几行,两个数不一定一样。

打个比方

第一条像点名叫一个人改,第二条像广播一声全班都改。

想一想

第二条如果手滑写成别的字段,还能撤回来吗?

09
第 5 章 · 上机

ALTER TABLE 六连击

加字段、改名、改类型、改表名,一步一步来。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

CHANGE 后面必须带数据类型,MODIFY 改不了名字,两个别用混。

分清楚

要改什么用哪一个
字段名CHANGE
类型或位置MODIFY
表名RENAME

想一想

表名一改,sc 表上那个外键还认得它吗?

10
第 5 章 · 上机

DROP 字段与 DROP 约束

删掉刚加的字段,再把 CHECK 换成允许加分的。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点先查名字再删

约束名只有 SHOW CREATE TABLE 看得到,查不到就写不出 DROP CONSTRAINT。

知道更多

两次 SHOW CREATE TABLE 对着看,差别只在 CHECK 那一行的上限。

想一想

换成 120 之后,180 分还插得进去吗?

11
第 5 章 · 上机

DELETE 与外键的第二次拦截

删一条成绩,再试着直接删一个有选课记录的学生。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

第二条报 1451,先删从表里引用它的记录,再回来删主表这一行。

记牢它正确顺序

  1. 先删从表 sc
  2. 再删主表 s
  3. 反过来一定被拦

想一想

外键写了 ON DELETE CASCADE 的话,这一步会变成什么样?

12
第 5 章 · 上机

按正确顺序删表

故意先删主表,看它怎么被拦,再按对的顺序来。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

第一条报 3730,s 还被 sc 的外键引着。先删 sc,s 和 c 就随便删了。

打个比方

拆房子先拆搭在墙上的雨棚,再拆墙,顺序反了雨棚会砸下来。

想一想

第 6 章还要用这几张表,收工前该做什么?

第 5 章 · 上机

连续练习版

十二道题都做完以后,从建表到删表连着敲一遍。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
浏览器里的迷你 MySQL,敲什么就真算什么。建的表真存住,约束真拦人,报错号照真机。
mysql>

重 点

一键跑完会按顺序执行全部三十条,自己一条条敲收获更大。

知道更多

这一串把本章的命令全覆盖了,从建表到删表能连着跑通就算过关。

想一想

这一串里,哪一条最不该在真机上随手敲?

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