第16周 视图设计与事务管理
第16周 · 视图设计与事务管理
这周两个重要概念:视图让你把常用查询"存成快捷方式"反复用;事务保证一组操作要么全成、要么全败(典型如银行转账)。一个是"查询封装",一个是"操作安全带"。
一、知识点:视图是什么
视图(View)是一张虚拟表:它不存真实数据,只是一个保存起来的 SELECT 查询。每次查视图,MySQL 都现场跑背后的 SELECT。
类比:视图像桌面的快捷方式,真实文件(基表)在别处;双击快捷方式看到的还是原文件内容。
二、操作教程:创建视图 CREATE VIEW
-- 把"学生姓名+成绩"的联查存成视图
CREATE VIEW v_stu_grade AS
SELECT s.sname, sc.grade
FROM student s JOIN sc ON s.sid = sc.sid;
-- 之后像查表一样查视图
SELECT * FROM v_stu_grade;
视图名一般以
v_开头,方便识别。
三、知识点:视图的作用
- 简化复杂查询:常用多表联查封装一次,以后直接
SELECT * FROM 视图。 - 安全性/权限控制:只把视图授权给用户,隐藏基表的敏感列(如工资、密码列)。
- 逻辑独立性:基表结构变了,改视图定义即可,应用层不用改。
四、知识点:可更新视图的限制
不是所有视图都能用来 INSERT/UPDATE/DELETE。可更新视图通常要求:
- 基于单张基表;
- 不含 聚合函数、GROUP BY、DISTINCT、JOIN、子查询等。
上面
v_stu_grade是两张表 JOIN 的,属于不可更新视图,只能查不能改。考试一般不深考更新,记住"多表/聚合视图通常只读"即可。
删除视图:
DROP VIEW v_stu_grade;
五、知识点:事务与 ACID
事务(Transaction) 是一组 SQL 操作,要么全部成功提交,要么全部失败回滚,保证数据一致。
四大特性 ACID: | 特性 | 含义 | | --- | --- | | A 原子性 | 事务内操作不可分割,全成或全败 | | C 一致性 | 数据从一个一致状态到另一个一致状态 | | I 隔离性 | 并发事务互不干扰 | | D 持久性 | 提交后修改永久保存 |
六、操作教程:事务控制 BEGIN / COMMIT / ROLLBACK
-- 开启事务
START TRANSACTION;
-- 一组操作(如给 2024001 成绩 +5)
UPDATE sc SET grade = grade + 5 WHERE sid = 2024001;
-- 检查无误,提交(修改永久生效)
COMMIT;
-- 如果中途发现错了,撤销整个事务(回到开启前)
-- ROLLBACK;
关键点:
COMMIT之前,改动都"悬着";一旦ROLLBACK,所有未提交修改全部撤销。COMMIT之后就不能再回滚了。
转账案例(A 减钱、B 加钱必须同时成功):
START TRANSACTION;
UPDATE account SET money = money - 100 WHERE name = 'A';
UPDATE account SET money = money + 100 WHERE name = 'B';
COMMIT; -- 两句都成功才提交;任一句出错就 ROLLBACK
七、综合实操:作业三题
-- 题1:建视图并查询
CREATE VIEW v_stu_grade AS
SELECT s.sname, sc.grade
FROM student s JOIN sc ON s.sid = sc.sid;
SELECT * FROM v_stu_grade;
-- 题2:用事务保证加分原子性
START TRANSACTION;
UPDATE sc SET grade = grade + 5 WHERE sid = 2024001;
COMMIT;
-- 出错时执行 ROLLBACK; 撤销
-- 题3:要点(见上文视图作用、可更新限制、COMMIT/ROLLBACK 作用)
八、易混点排查表
| 现象 | 解决方法 |
|---|---|
| 以为视图存了数据 | 视图是虚拟表,只存查询定义,不存数据 |
| 改视图报不可更新 | 多表/聚合视图只读;需改数据直接改基表 |
| 改完数据"不见了" | 可能在一个未 COMMIT 的事务里,提交后才生效 |
| ROLLBACK 无效 | 已 COMMIT 的事务不能回滚;错在提交前才撤 |
| 视图和表分不清 | 视图名加 v_ 前缀;SHOW TABLES 会列视图但本质是虚拟 |
| 并发改同一行乱了 | 理解隔离性;必要时用事务+锁 |
九、小测验(自测)
- 视图是真实存数据的表吗?创建视图的基本语法是什么?
- 视图的三个主要作用?什么情况下视图"不可更新"?
- 事务中
COMMIT和ROLLBACK分别干什么?为什么转账要用事务? - 简述 ACID 四个特性中"原子性"和"持久性"的含义。
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号