存储过程和触发器的总结

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;
相关推荐
身如柳絮随风扬15 小时前
什么是左匹配规则?
数据库·sql·mysql
xinhuanjieyi15 小时前
ruoyimate导入sql\antflow\bpm_init_db.sql报错
android·数据库·sql
哈__15 小时前
从内核阻断 SQL 注入:金仓 KingbaseES SQL 防火墙技术解析与实践
数据库·sql
柏箱16 小时前
双引号与括号的博弈:sqli-labs第四关注入实战(图文结合详解)
sql·网络空间安全
Java水解17 小时前
SQL 核心概念:JOIN 和 UNION 到底有什么区别?
后端·sql
Y0011123617 小时前
Day10-MySQL-事物
数据库·sql·mysql
V1ncent Chen19 小时前
SQL大师之路 12 函数基础
数据库·sql·mysql·数据分析
焚 城19 小时前
SQL PARTITION BY用法
数据库·sql
zdl6861 天前
mybatisPlus打印sql配置
数据库·sql
zdl6861 天前
Mybatis控制台打印SQL执行信息(执行方法、执行SQL、执行时间)
数据库·sql·mybatis