触发器
数据库基本知识点 :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语句之间共享。