[MySQL]视图&触发器
视图 (Views)
1. 核心定义
视图是一个虚拟表,其内容由查询定义。
- 同真实的表一样,视图包含一系列带有名称的列和行数据。
- 关键点:视图并不在数据库中以存储的数据值集形式存在(不占物理空间,只存定义)。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
2. 语法操作
创建视图
1 | CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] |
- ALGORITHM 参数详解:
MERGE: 将视图的SQL语句与外部查询合并(效率高,优先推荐)。TEMPTABLE: 将视图结果存入临时表,再执行外部查询(无法更新数据)。UNDEFINED: 让MySQL自动选择(默认)。
- WITH CHECK OPTION: 更新视图数据时,强行保证数据仍符合视图定义的 WHERE 条件,否则报错。
查看与修改
1 | -- 查看结构 |
3. 视图的可更新性
并非所有视图都能执行 INSERT, UPDATE, DELETE。如果视图定义包含以下任意一项,则该视图不可更新:
- 聚合函数 (
SUM(),MIN(),MAX(),COUNT()等)。 - DISTINCT 关键字。
- GROUP BY 子句。
- HAVING 子句。
- UNION 或 UNION ALL。
- FROM 子句中包含不可更新的视图。
- SELECT 子句中的子查询。
- 仅引用了字面值(Literal value)。
- ALGORITHM 指定为
TEMPTABLE。
触发器 (Triggers)
1. 核心定义
触发器是与表有关的数据库对象,在满足定义条件(Insert/Update/Delete)时触发,并自动执行触发器中定义的语句集合。
2. 六种触发场景
MySQL 仅支持行级触发器 (FOR EACH ROW),不支持语句级触发器。
| 动作 | 时机 | 组合方式 |
|---|---|---|
| INSERT | BEFORE / AFTER | BEFORE INSERT, AFTER INSERT |
| UPDATE | BEFORE / AFTER | BEFORE UPDATE, AFTER UPDATE |
| DELETE | BEFORE / AFTER | BEFORE DELETE, AFTER DELETE |
3. NEW 与 OLD 关键字
在触发器主体中,必须使用 OLD 和 NEW 关键字来访问行数据:
| 操作 | NEW (新值) | OLD (旧值) |
|---|---|---|
| INSERT | 可用 (即将/已插入的值) | 不可用 |
| UPDATE | 可用 (更新后的值) | 可用 (更新前的值) |
| DELETE | 不可用 | 可用 (即将/已删除的值) |
NEW.column_name: 拥有读写权限(在BEFORE触发器中可修改NEW值以强行改变入库数据)。OLD.column_name: 仅有只读权限。
4. 语法操作
创建触发器
1 | DELIMITER $$ |
查看与删除
1 | -- 查看 |
5. 核心限制与注意事项
- 事务一致性: 触发器与触发它的语句处于同一个事务中。
- 若
BEFORE触发器失败,SQL语句不执行。 - 若 SQL 语句失败,
AFTER触发器不执行。 - 若
AFTER触发器失败,整个事务回滚。
- 若
- 禁止语句: 触发器内部不能包含显式的事务控制语句(如
START TRANSACTION,COMMIT,ROLLBACK)。 - 返回值: 触发器不能返回结果集(Result Set),只能通过
SIGNAL SQLSTATE抛出异常中断操作。 - 递归: 默认情况下,MySQL 不禁止触发器引发循环调用(需注意逻辑死循环)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 DuckLing's Blog!

