MySQL(3-触发器和视图)
触发器
什么是触发器?
触发器是与表有关的数据库对象,当我们对一个表进行数据操作时,可以在 insert、 update、 delete 之前或之后触发并执行触发器中定义的 SQL 语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作,这种特性可以协助应用系统在数据库端确保数据的完整性、日志记录、数据校验等操作。
特点:
- 自动执行:当满足特定条件时自动触发
- 与表相关:触发器必须关联到特定表
- 事件驱动:响应 INSERT、UPDATE、DELETE 操作
- 不可调用:不能像存储过程那样直接调用
缺点:
-
性能影响:触发器会增加数据库负担,复杂触发器可能影响性能
-
调试困难:触发器错误可能难以调试
-
递归触发:可能导致意外的递归触发
-
事务处理:触发器在事务中执行,失败会导致整个事务回滚
-
MySQL 限制:
- 同一表同一事件同一时间的触发器只能有一个
- 不能在触发器中使用 CALL 调用存储过程
- 不能在触发器中使用事务控制语句(COMMIT, ROLLBACK 等)
查看
1 | show triggers [from schema_name]; |
删除
1 | drop trigger [if exists] [schema_name.]触发器名称; |
创建
1 | CREATE TRIGGER 触发器名称 |
- BEFORE 和 AFTER:指定了触发器执行的时间,前者在触发器事件之前执行触发器语句,后者在触发器事件之后执行触发器语句;
- INSERT、UPDATE、DELETE:表示触发事件,即触发器执行条件(触发事件)
- FOR EACH ROW:行级触发器,修改一行数据触发一次,不写就默认语句级触发器,不管修改多少行数据,只执行一次
注意
可以使用别名 NEW 和 OLD 来引用触发器中发生变化的内容记录,mysql 中定义了 new 和 old,用来表示触发器的所在表中触发了触发器的那一行数据
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
- 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
- 在 UPDATE 型触发器中,OLD 用来表示已经被修改的原数据,NEW 用来表示将要修改为的新数据;
- 在 DELETE 型触发器中,OLD 用来表示已经被删除的原数据;
触发器执行顺序
- 如果 BEFORE 触发器执行失败,SQL 无法正确执行
- SQL 执行失败时,AFTER 型触发器不会触发
- AFTER 类型的触发器执行失败,SQL 会回滚
使用案例
- 数据插入后进行更新
1 | DELIMITER $$ |
- 数据删除后进行更新
1 | DELIMITER $$ |
视图
什么是视图?
视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不看整个数据库表中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。
特点:
- 虚拟表:不存储实际数据,只存储查询定义
- 动态数据:每次访问视图时都会执行其定义的查询
- 简化查询:可以封装复杂查询逻辑
- 数据安全:可以限制用户访问底层表的特定列
- 逻辑抽象:为应用程序提供一致的数据接口
创建
1 | CREATE[OR REPLACE] VIEW viewname[(columnlist)] |
- CREATE:表示创建新的视图;
- REPLACE:表示替换已经创建的视图;
- columnlist:属性列,表示可以显示的指出视图中有哪些列(必须和 select 语句对应);
- viewname:视图的名称;
- SELECT statement:表示 SELECT 语句;
修改
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。
1 | ALTER VIEW viewname[columnlist] |
注意:当真实表中修改了某个存在视图中的字段时,这个视图也需要跟着变,否则会变成无效的视图
删除
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。
1 | DROP VIEW [IF EXISTS] viewname [,viewname....]; |
查看
1 | # 查看视图基本信息 |
更新视图数据
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图实质是一个虚拟表,其中没有数据,通过视图更新时都是转换到基本表更新。更新视图时,只能更新权限范围内的数据,超出范围就不能更新了。
不能更新的情况:
- 视图中包含 SUM()、COUNT()、MAX()和 MIN()等函数;
- 视图中包含 UNION、UNION ALL、DISTINCT、GROUP BY 和 HAVING 等关键字;
- 视图对应的表存在没有默认值的列,而且该列没有包含在视图里;
- 包含子查询的视图;
- 其他特殊情况;
使用案例
- 在单表上创建视图
1 | create view view_student |
- 在多表上创建视图
1 | create view view_student_teacher |
- 修改视图
1 | alter view view_student_teacher |
- 更新视图数据
1 | CREATE VIEW high_salary_emps AS |