准备环境:建库、进库、看看空不空
先把 teaching 库准备好,确认里面还没有表。
重 点
第一条会提示已经存在,这是 IF NOT EXISTS 在替你挡下报错。
知道更多
这台终端是真解释器,敲什么真算什么,建的表会一直留到你删掉为止。
想一想
SHOW TABLES 说是空的,你打算先建哪张表?
先把 teaching 库准备好,确认里面还没有表。
第一条会提示已经存在,这是 IF NOT EXISTS 在替你挡下报错。
这台终端是真解释器,敲什么真算什么,建的表会一直留到你删掉为止。
SHOW TABLES 说是空的,你打算先建哪张表?
照教材的写法把学生表建出来,六个字段加一个主键。
提示符会变成箭头等着你补,真机也是这样,分号才算说完。
| 想看什么 | 敲哪一条 |
|---|---|
| 字段一览 | DESC s |
| 完整建表语句 | SHOW CREATE TABLE s |
回显里的 sex 那一行,Default 列写的是什么?
一条不给学号,一条不给性别,看哪条能进去。
第一条没给 sno 报 1364,第二条没给 sex 却成了,因为 sex 有默认值。
NOT NULL 加 DEFAULT,不给值就用默认值,所以插得进去。
给 sno 也加一个默认值,是好主意吗?
加上唯一约束,然后故意插一个重名的学生。
第二条报 1062 Duplicate entry,姓名重了就是重了。
最后一条能看到 UNIQUE KEY uq_sn 这一行,起了名字以后才好删。
现实里给姓名加唯一约束,会出什么问题?
一张带 CHECK,一张带联合主键和两个外键。
sc 引用了 s 和 c,所以这两张必须先建出来,否则报 1824。
选课表为什么要拿两个字段合起来当主键?
先插两门课,再故意插一个不存在的学号。
第二条报 1452,学生表里根本没有 s99,外键当场拦下。
就像报名表上写了一个查无此人的学号,登记员直接把表退回来。
如果没有外键约束,这条脏数据会怎么样?
一次插多行、只填两列、再试一个 180 分。
改一个人的专业,再给所有人的年龄加一岁。
Rows matched 是命中几行,Changed 是真改了几行,两个数不一定一样。
第一条像点名叫一个人改,第二条像广播一声全班都改。
第二条如果手滑写成别的字段,还能撤回来吗?
加字段、改名、改类型、改表名,一步一步来。
CHANGE 后面必须带数据类型,MODIFY 改不了名字,两个别用混。
| 要改什么 | 用哪一个 |
|---|---|
| 字段名 | CHANGE |
| 类型或位置 | MODIFY |
| 表名 | RENAME |
表名一改,sc 表上那个外键还认得它吗?
删掉刚加的字段,再把 CHECK 换成允许加分的。
约束名只有 SHOW CREATE TABLE 看得到,查不到就写不出 DROP CONSTRAINT。
两次 SHOW CREATE TABLE 对着看,差别只在 CHECK 那一行的上限。
换成 120 之后,180 分还插得进去吗?
删一条成绩,再试着直接删一个有选课记录的学生。
第二条报 1451,先删从表里引用它的记录,再回来删主表这一行。
外键写了 ON DELETE CASCADE 的话,这一步会变成什么样?
故意先删主表,看它怎么被拦,再按对的顺序来。
第一条报 3730,s 还被 sc 的外键引着。先删 sc,s 和 c 就随便删了。
拆房子先拆搭在墙上的雨棚,再拆墙,顺序反了雨棚会砸下来。
第 6 章还要用这几张表,收工前该做什么?
十二道题都做完以后,从建表到删表连着敲一遍。
一键跑完会按顺序执行全部三十条,自己一条条敲收获更大。
这一串把本章的命令全覆盖了,从建表到删表能连着跑通就算过关。
这一串里,哪一条最不该在真机上随手敲?