触发器
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_insertAFTER 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_updateAFTER 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语句之间共享。