存储过程和触发器的总结

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;
相关推荐
怣501 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
证榜样呀3 小时前
2026 中专大数据技术专业可考的证书有哪些,必看!
大数据·sql
Codefengfeng3 小时前
数据安全知识点速通
sql
逍遥德4 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
驾数者5 小时前
Flink SQL实时数仓实战:基于Flink SQL的完整项目案例
sql·flink·linq
此刻你17 小时前
常用的 SQL 语句
数据库·sql·oracle
山岚的运维笔记19 小时前
SQL Server笔记 -- 第14章:CASE语句
数据库·笔记·sql·microsoft·sqlserver
中二病码农不会遇见C++学姐21 小时前
SQLiteStudio 下载安装指南
sql
一碗面42121 小时前
SQL性能优化:让数据库飞起来
数据库·sql·性能优化