Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

    • MySQL 为什么一定要有一个主键
    • MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
    • MySQL 的行级锁到底锁的是什么东西?
    • 存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    • 数据库的三范式是什么?
    • 说说 InnoDB 与 MyISAM 的区别
    • drop、truncate、delete 的区别
    • 聊一聊数据库事务机制
    • 聊一聊 MySQL 中的关联查询
    • 事务隔离级别有哪些?MySQL 的默认隔离级别是什么
    • 分库分表之后,id 主键如何处理?
    • 说说在 MySQL 中一条查询 SQL 是如何执行的?
    • 讲解下 DDL、DML、DCL
    • 存储过程和触发器的作用
      • MySQL 如何行转列和列转行
      • 如何查看 SQL 的执行计划
      • union 和 unionAll 的区别
      • having 和 where 的区别
      • 常见的索引原则
      • MySQL 中的 IN 和 EXISTS 子句有什么区别?
      • MySQL 如何处理 NULL 值,对性能有什么影响?
      • 如何在 MySQL 中处理和避免全表扫描?
      • MySQL 中的表空间是什么,它的作用是什么?
      • 在 MySQL 中,如何优化 ORDER BY 查询?
    • Java 8 + 特性类

    • 其他技术类

    • 常见面试题
    • MySQL 类
    刘博
    2025-12-29
    目录

    存储过程和触发器的作用

    # 1. 存储过程(Stored Procedure)

    • 定义:存储在数据库中的 “预编译 SQL 语句集合”,可包含条件判断、循环、变量等逻辑,通过调用名称执行,无需重复编写 SQL;

    • 核心作用:

      • 简化复杂业务逻辑:将多步 SQL(如查询 + 修改 + 插入)封装为存储过程,应用层直接调用(如CALL add_order(1, '商品A')),减少应用层与数据库的交互次数;
      • 提高性能:存储过程预编译后存储在数据库中,调用时无需再次解析、优化,比单次执行多条 SQL 更快;
      • 增强安全性:通过存储过程执行数据操作,可限制应用层直接访问表,只授予存储过程的调用权限,避免误操作或恶意修改;
      • 代码复用:多个应用(如 Web 端、APP 端)可调用同一存储过程,避免重复编写 SQL 逻辑;
    • 语法示例:

      -- 创建存储过程:添加订单并扣减库存
      DELIMITER // -- 修改结束符(默认;,避免与存储过程内;冲突)
      CREATE PROCEDURE add_order(IN user_id INT, IN goods_id INT, IN num INT)
      BEGIN
          -- 插入订单
          INSERT INTO `order` (user_id, goods_id, num) VALUES (user_id, goods_id, num);
          -- 扣减库存
          UPDATE goods SET stock = stock - num WHERE id = goods_id;
      END //
      DELIMITER ; -- 恢复结束符
      
      -- 调用存储过程
      CALL add_order(1, 2001, 2);
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
    • 优缺点:

      • 优点:简化逻辑、提高性能、增强安全、代码复用;
      • 缺点:调试困难(需用专门工具)、移植性差(不同数据库的存储过程语法差异大)、占用数据库资源。

    # 2. 触发器(Trigger)

    • 定义:绑定在表上的 “自动执行的 SQL 逻辑”,当表发生特定事件(INSERT/UPDATE/DELETE)时,触发器自动触发执行,无需手动调用;

    • 核心作用:

      • 保证数据一致性:如订单表插入数据时,自动扣减商品表库存(替代应用层逻辑,避免漏扣);
      • 记录数据变更日志:如用户表数据修改时,自动插入日志表(记录修改前、修改后的值、修改时间、操作用户);
      • 数据校验:如插入用户数据时,校验手机号格式是否正确,不正确则拒绝插入;
      • 级联操作:如删除用户时,自动删除该用户的所有订单(替代外键的 ON DELETE CASCADE,更灵活);
    • 语法示例:

      -- 创建触发器:插入订单时,自动扣减商品库存
      DELIMITER //
      CREATE TRIGGER trigger_order_after_insert
      AFTER INSERT ON `order` -- 订单表插入后触发
      FOR EACH ROW -- 行级触发器(每插入一行触发一次)
      BEGIN
          UPDATE goods SET stock = stock - NEW.num WHERE id = NEW.goods_id; -- NEW表示插入的新行数据
      END //
      DELIMITER ;
      
      -- 插入订单,触发器自动执行
      INSERT INTO `order` (user_id, goods_id, num) VALUES (1, 2001, 2);
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
    • 触发器的关键要素:

      • 触发时机:AFTER(事件后触发)、BEFORE(事件前触发);
      • 触发事件:INSERT、UPDATE、DELETE;
      • 触发级别:行级触发器(FOR EACH ROW,每一行触发)、语句级触发器(FOR EACH STATEMENT,整个语句触发一次);
      • 特殊变量:NEW(INSERT/UPDATE 后的新数据)、OLD(UPDATE/DELETE 前的旧数据);
    • 优缺点:

      • 优点:自动执行、保证数据一致性、简化应用层逻辑;
      • 缺点:隐式执行(不易排查问题)、可能影响性能(复杂触发器会拖慢表操作)、移植性差。

    # 3. 存储过程与触发器的区别

    对比维度 存储过程 触发器
    执行方式 手动调用(CALL 语句) 自动触发(表事件触发)
    触发条件 无(需显式调用) 表的 INSERT/UPDATE/DELETE 事件
    适用场景 复杂业务逻辑(多表操作、循环、条件判断) 数据一致性保障、日志记录、数据校验
    灵活性 高(支持参数、返回值、复杂逻辑) 低(仅能绑定表事件,逻辑简单)

    上次更新: 12/30/2025
    讲解下 DDL、DML、DCL
    MySQL 如何行转列和列转行

    ← 讲解下 DDL、DML、DCL MySQL 如何行转列和列转行→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式