视图 (Views)

1. 核心定义

视图是一个虚拟表,其内容由查询定义。

  • 同真实的表一样,视图包含一系列带有名称的列和行数据。
  • 关键点:视图并不在数据库中以存储的数据值集形式存在(不占物理空间,只存定义)。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

2. 语法操作

创建视图

1
2
3
4
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION];
  • ALGORITHM 参数详解:
    • MERGE: 将视图的SQL语句与外部查询合并(效率高,优先推荐)。
    • TEMPTABLE: 将视图结果存入临时表,再执行外部查询(无法更新数据)。
    • UNDEFINED: 让MySQL自动选择(默认)。
  • WITH CHECK OPTION: 更新视图数据时,强行保证数据仍符合视图定义的 WHERE 条件,否则报错。

查看与修改

1
2
3
4
5
6
7
8
9
-- 查看结构
DESC view_name;
SHOW CREATE VIEW view_name;

-- 修改定义
ALTER VIEW view_name AS select_statement;

-- 删除视图
DROP VIEW [IF EXISTS] view_name;

3. 视图的可更新性

并非所有视图都能执行 INSERT, UPDATE, DELETE。如果视图定义包含以下任意一项,则该视图不可更新

  1. 聚合函数 (SUM(), MIN(), MAX(), COUNT() 等)。
  2. DISTINCT 关键字。
  3. GROUP BY 子句。
  4. HAVING 子句。
  5. UNIONUNION ALL
  6. FROM 子句中包含不可更新的视图
  7. SELECT 子句中的子查询。
  8. 仅引用了字面值(Literal value)。
  9. 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 关键字

在触发器主体中,必须使用 OLDNEW 关键字来访问行数据:

操作 NEW (新值) OLD (旧值)
INSERT 可用 (即将/已插入的值) 不可用
UPDATE 可用 (更新后的值) 可用 (更新前的值)
DELETE 不可用 可用 (即将/已删除的值)
  • NEW.column_name: 拥有读写权限(在 BEFORE 触发器中可修改 NEW 值以强行改变入库数据)。
  • OLD.column_name: 仅有只读权限。

4. 语法操作

创建触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELIMITER $$

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- 触发器逻辑
-- 示例:阻断非法操作
-- IF NEW.amount < 0 THEN
-- SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Amount cannot be negative';
-- END IF;
END$$

DELIMITER ;

查看与删除

1
2
3
4
5
6
-- 查看
SHOW TRIGGERS;
SHOW CREATE TRIGGER trigger_name;

-- 删除
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;

5. 核心限制与注意事项

  1. 事务一致性: 触发器与触发它的语句处于同一个事务中。
    • BEFORE 触发器失败,SQL语句不执行。
    • 若 SQL 语句失败,AFTER 触发器不执行。
    • AFTER 触发器失败,整个事务回滚。
  2. 禁止语句: 触发器内部不能包含显式的事务控制语句(如 START TRANSACTION, COMMIT, ROLLBACK)。
  3. 返回值: 触发器不能返回结果集(Result Set),只能通过 SIGNAL SQLSTATE 抛出异常中断操作。
  4. 递归: 默认情况下,MySQL 不禁止触发器引发循环调用(需注意逻辑死循环)。