数据库(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语句之间共享。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值