数据库(mysql)-新手笔记(触发器,存储过程)

触发器

数据库基本知识点 :http://t.csdnimg.cn/CVa9e

MySQL触发器(Trigger)是一种与表事件(如INSERT、UPDATE或DELETE)相关联的特殊类型的存储过程。

当指定表上的特定事件发生时,触发器会自动执行或激活。触发器可以在数据修改之前或之后执行,因此它们可以用于在数据插入、更新或删除时自动执行一系列操作。

模版

DELIMITER //  
CREATE TRIGGER trigger_name  
AFTER INSERT ON table_name FOR EACH ROW  
BEGIN  
    -- 在这里编写触发器要执行的SQL语句  
    -- 可以使用NEW关键字来引用新插入的行  
    -- 例如,假设我们想要将新插入的记录ID插入到另一个日志表中  
    INSERT INTO log_table (record_id, action, timestamp)  
    VALUES (NEW.id, 'INSERT', NOW());  
END;  
//  
DELIMITER ;

我们可以利用 创建一个触发器容易存储某个表修改或者存储

-- 创建 orders 表
CREATE TABLE orders (
                        order_id INT AUTO_INCREMENT PRIMARY KEY,
                        customer_id INT,
                        order_date DATETIME,
                        total_amount DECIMAL(10, 2)
);

-- 创建 order_logs 表来记录 orders 表的变化
CREATE TABLE order_logs (
                            log_id INT AUTO_INCREMENT PRIMARY KEY,
                            order_id INT,
                            action VARCHAR(50),
                            log_date DATETIME
);
DELIMITER //
CREATE TRIGGER after_order_insert
    AFTER INSERT  ON orders FOR EACH ROW
BEGIN
    -- 使用 NEW 关键字引用新插入的订单记录
    INSERT INTO order_logs (order_id, action, log_date)
    VALUES (NEW.order_id, 'INSERT', NOW());
END;
//
DELIMITER ;
DELIMITER //
CREATE TRIGGER after_order_update
    AFTER UPDATE ON orders FOR EACH ROW
BEGIN
    -- 使用 NEW 关键字引用更新后的订单记录
    -- 使用 OLD 关键字引用更新前的订单记录(如果需要的话)
    INSERT INTO order_logs (order_id, action, log_date)
    VALUES (NEW.order_id, 'UPDATE', NOW());
    -- 如果需要记录具体哪些字段被更新了,可以添加额外的逻辑
END;
//
DELIMITER ;

存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,这些语句被预先编译并存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,尤其在数据量特别庞大的情况下,利用存储过程可以达到倍速的效率提升

模版

DELIMITER 
$$
  
  
CREATE PROCEDURE 触发器名称(IN 导入的变量 数据类型, OUT 导出变量 数据类型)
# IN 表示导入形参 out 表示导出形参  
BEGIN  
    DECLARE 定义变量名 数据类型;  //声明一个变量 只能在该作用域使用
      
    -- 查询价格大于num的商品数量  
    SELECT COUNT(*) INTO count_num FROM 表名 WHERE 字段名 > 数值或变量;  
# COUNT(*) 统计行数 将其存到了count_num 中
      
    -- 根据数量范围设置不同的返回值  
    IF 变量名 > 数值 THEN  
        SET 字段名 = 数据值;  

# THEN 表示执行语句满足就执行
  
    ELSEIF 变量名 > 数值   
        SET 字段名 = 数值;  
    ELSE  
        SET 变量名 = 数值;  
    END IF;  
END
$$
  
  
DELIMITER ;

DELIMITER 
$$
  
  
CREATE PROCEDURE `CountGoodsByPrice`(IN num INT, OUT total VARCHAR(255))
# IN 表示导入形参 out 表示导出形参  
BEGIN  
    DECLARE count_num INT;  //声明一个变量 只能在该作用域使用
      
    -- 查询价格大于num的商品数量  
    SELECT COUNT(*) INTO count_num FROM goods WHERE pre_price > num;  
# COUNT(*) 统计行数 将其存到了count_num 中
      
    -- 根据数量范围设置不同的返回值  
    IF count_num > 1000 THEN  
        SET total = '大于1000条';  
    ELSEIF count_num > 1 AND count_num <= 10 THEN  
        SET total = '大于1条 小于 10 条';  
    ELSEIF count_num > 10 AND count_num <= 1000 THEN  
        SET total = '大于10条小于 1000';  
    ELSE  
        SET total = '小于或等于1条';  
    END IF;  
END
$$
  
  
DELIMITER ;

调用procedure存储过程

#调用存储过程 用 CALL
CALL CountGoodsByPrice(50, @result); 
#查询导出result的结果 
SELECT @result;
#
@ 符号用于定义用户定义的变量(user-defined variables)。这些变量与会话(session)相关联,并且可以在会话中的多个SQL语句之间共享。

相关推荐

  1. 数据库(mysql)-新手笔记(触发器,存储过程)

    2024-03-15 03:30:03       39 阅读
  2. MySQL存储过程触发器

    2024-03-15 03:30:03       66 阅读
  3. MySQL存储过程触发器

    2024-03-15 03:30:03       57 阅读
  4. mysql触发器存储过程

    2024-03-15 03:30:03       44 阅读
  5. MySQL-笔记-09.存储过程触发器的使用

    2024-03-15 03:30:03       33 阅读
  6. MySQL的视图、存储过程触发器

    2024-03-15 03:30:03       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 03:30:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 03:30:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 03:30:03       82 阅读
  4. Python语言-面向对象

    2024-03-15 03:30:03       91 阅读

热门阅读

  1. Leetcode面试经典150题

    2024-03-15 03:30:03       40 阅读
  2. Winform程序中UI更新延迟

    2024-03-15 03:30:03       37 阅读
  3. 爬虫:爬取新闻内容及图片,存入数据库

    2024-03-15 03:30:03       44 阅读
  4. 怎样把1.ts-10.ts的文件拼接成一个MP4文件

    2024-03-15 03:30:03       47 阅读