存储过程和触发器的总结

1. 存储过程的作用是什么?

存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。主要作用包括:

  • 性能优化:预编译执行,速度比单个SQL语句快

  • 代码重用:可重复调用,减少重复代码

  • 安全性:限制用户直接访问数据库表

  • 事务管理:实现复杂的事务逻辑

  • 降低耦合:表结构变化时只需修改存储过程

2. 如何创建一个存储过程?

复制代码
DELIMITER //
CREATE PROCEDURE 存储过程名([IN/OUT/INOUT 参数名 参数类型] [,...])
BEGIN
    -- SQL语句
END //
DELIMITER ;

3. MySQL中的变量都有哪几种?

  • 系统变量:MySQL服务器的配置变量

  • 用户自定义变量:在SQL会话中定义的变量

  • 局部变量:在存储过程、函数或触发器范围内有效的变量

4. 如何定义一个变量?

用户自定义变量:

复制代码
SET @var_name = expr;
SET @var_name := expr;
SELECT @var_name := expr;
SELECT 列名 INTO @var_name FROM 表名;

局部变量:

复制代码
DECLARE 变量名 变量类型 [DEFAULT 默认值];

5. MySQL中使用变量是否需要提前声明?

  • 用户自定义变量:不需要提前声明

  • 局部变量:必须在使用前声明

6. MySQL中的参数分为哪几种?

  • IN:输入类型(默认)

  • OUT:输出类型,可作为返回值

  • INOUT:输入输出类型

7. 用过游标吗?游标的作用是什么?

游标用于在存储过程中对查询结果集进行逐行检索。使用步骤:

  1. 声明游标:DECLARE 游标名 CURSOR FOR 查询语句;

  2. 打开游标:OPEN 游标名;

  3. 获取记录:FETCH 游标名 INTO 变量;

  4. 关闭游标:CLOSE 游标名;

8. 了解条件处理程序吗?介绍一下如何使用

条件处理程序用于处理程序执行过程中的异常:

复制代码
DECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement

-- 示例:处理游标越界
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done := TRUE;

9. 存储函数与存储过程的区别是什么?

  • 存储函数必须有返回值,存储过程不一定

  • 存储函数参数只能是IN类型

  • 存储函数类似于内置函数,可直接在SQL中使用

10. 如何查看数据库中创建的存储过程?

复制代码
-- 查看指定数据库的存储过程
SELECT * FROM information_schema.ROUTINES 
WHERE ROUTINE_SCHEMA = '数据库名';

-- 查看存储过程定义
SHOW CREATE PROCEDURE 存储过程名;

11. 什么是触发器?

触发器是与表关联的数据库对象,在对表进行INSERT、UPDATE、DELETE操作时自动执行预定义的SQL语句。

12. MySQL中触发器分为几种类型?

按操作类型分为:

  • INSERT触发器

  • UPDATE触发器

  • DELETE触发器

13. 行级触发器与语句级触发器的区别是什么?

  • 行级触发器:对每一行数据操作都会触发

  • 语句级触发器:整个语句执行只触发一次

  • MySQL只支持行级触发器

14. 说一下了解的触发器使用场景都有哪些?

  • 数据审计:记录数据变更日志

  • 数据验证:实施复杂的业务规则

  • 数据同步:维护相关表的数据一致性

  • 自动计算:维护衍生数据

15. 如果对一表中的数据进行更新,要在日志表中记录该条记录更新前与更新后的值,如何实现?

使用UPDATE触发器,通过OLD和NEW关键字访问新旧值:

复制代码
CREATE TRIGGER trg_student_update 
AFTER UPDATE ON student FOR EACH ROW 
BEGIN
    INSERT INTO student_log(operation_type, operation_time, operation_id, operation_data)
    VALUES('update', NOW(), NEW.id, 
           CONCAT(OLD.id,',',OLD.name,...,'|',NEW.id,',',NEW.name,...));
END;

16. 如何查看数据库中创建的触发器?

复制代码
SHOW TRIGGERS;

-- 删除触发器
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;
相关推荐
熬夜敲代码的小N2 小时前
MySQL数据可视化实战:从SQL雕琢到图表绽放
sql·mysql·信息可视化
l1t2 小时前
一个在postgresql中运行很快,但是在duckdb中运行很慢的SQL
数据库·sql·postgresql·duckdb
码界奇点3 小时前
深入解析MySQL9主从复制架构详解从原理到实战
数据库·sql·架构·可用性测试
roman_日积跬步-终至千里4 小时前
【大数据框架】Calcite 基础概念:从 SQL 到执行计划的思维路径
java·大数据·sql
狂龙骄子4 小时前
MySQL表字段批量修改SQL实战技巧
数据库·sql·mysql·alter table·批量修改·sql实战技巧
roman_日积跬步-终至千里4 小时前
【SQL】SQL 语句的解析顺序:理解查询执行的逻辑
java·数据库·sql
曲幽4 小时前
告别重复劳动:SQL Server存储过程实战手册,从入门到高效协作
sql·select·cursor·declare·trigger·procedure
heartbeat..4 小时前
数据库性能优化:SQL 语句的优化(原理+解析+面试)
java·数据库·sql·性能优化
yuhaiqun19894 小时前
SQL+VSCode实战指南:AI赋能高效数据库操作
数据库·人工智能·经验分享·vscode·sql·学习·学习方法