数据库原理与应用 第 7 章 · 上机二
课程第 7 章上机二 先备料换列名插一行改和删撞 1471撞 1395把关删视图连起来 版式
第 7 章 视图和索引 · 上机二

改视图与通过视图改数据

八道题,先改定义,再通过视图动数据,最后亲手撞四种改不了的情况。
已完成 0 / 8
本 次 上 机 题 目
  1. 01把这一页要用的视图先建出来
  2. 02ALTER VIEW 换一套列名
  3. 03通过视图往基本表里插数据
  4. 04通过视图改一行、删一行
  5. 05带分组的视图改不了数据
  6. 06多表连接的视图删不了
  7. 07WITH CHECK OPTION 会拦人
  8. 08删视图,再删掉它依赖的表
  9. 连续练习:插进去却看不见
01
第 7 章 · 上机二

把这一页要用的视图先建出来

每一页的终端各自独立,上一页建的视图这里没有。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

s_update_view 是整张表的镜子,没挑行也没挑列,等会儿拿它改数据。

知道更多

顶部的重置环境按钮能把这一页退回刚打开的样子,视图和数据一起清干净。

02
第 7 章 · 上机二

ALTER VIEW 换一套列名

同样三列数据,换三个名字显示。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

改完之后列名、列数、筛选条件全变了,视图名却还是原来那个。

想一想

外面的程序一直写着 SELECT * FROM s_view,它需要改吗?

03
第 7 章 · 上机二

通过视图往基本表里插数据

往视图里插,落到的是它背后那张 s 表。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

查的是基本表 s,插进去的那一行确确实实落在了 s 里。

练一练

这一行数据最后存在哪里?
  1. A存在视图 s_update_view 里
  2. B存在基本表 s 里
  3. C两边各存一份
答案 B

视图没有存数据的地方,所有的写操作都被翻译成对基本表的操作。

04
第 7 章 · 上机二

通过视图改一行、删一行

UPDATE 和 DELETE 同样落到基本表上。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

删完之后基本表回到八行,刚才那一行是真的从 s 里没了。

知道更多

视图能改数据的前提很窄,下一题就会看到大部分视图其实改不了。

05
第 7 章 · 上机二

带分组的视图改不了数据

一行是好几行算出来的,机器说不清该动哪一行。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

插报 1471 改报 1288,两个错误号不一样,但原因是同一个。

记牢它改不了的三种典型

  1. 带聚合函数
  2. 带 GROUP BY
  3. 带 DISTINCT
06
第 7 章 · 上机二

多表连接的视图删不了

一行横跨两张表,删它是删学生还是删选课记录。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

查得好好的视图,一到删就报 1395,一到插就报 1394。

想一想

这个视图查起来一点问题都没有,为什么删就不行?

07
第 7 章 · 上机二

WITH CHECK OPTION 会拦人

改完之后这一行还得留在视图的范围里。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

第一条能过第二条报 1369,差别只在插进去的那一行还在不在理学院。

知道更多

不加 WITH CHECK OPTION 时第二条也能插进去,只是插完就从视图里消失了。

08
第 7 章 · 上机二

删视图,再删掉它依赖的表

删视图不动数据,删基本表却会让视图变成空头支票。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

最后一条报 1356,视图还在,它依赖的那张表没了。

练一练

DROP VIEW s_update_view 之后,学生表 s 里的数据会怎样?
  1. A一起被删掉
  2. B一行不少
  3. C只剩视图里没有的那些行
答案 B

视图只存一句定义,删掉它就是删掉那句话,基本表一行都不会动。

第 7 章 · 上机二

连续练习:插进去却看不见

建、改、用、删各一遍,最后一条会让你愣一下。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端里的 teaching 库已经建好装好,直接敲命令就行。回车执行,也可以用下面的按钮。
mysql>

重 点

插进去了,可视图里找不着它,因为这一行的专业是空值,不在视图的范围内。

知道更多

这正是 WITH CHECK OPTION 要解决的事,加上它这一条插入会被直接拦掉。

想一想

第六条查不到,第七条却查得到,数据到底进去了没有?

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